JPA对象关系-嵌入
比如现在有这样一个类对象,保存公司信息,公司信息中有法人信息和运营信息都有人、地址、资金,可以把这6个字段分别对应1个列,每个都有单独的属性字段维护,这样是可以的。但是,这样对于面向对象编程,感觉还是有点多余,其中法人、地址和资金都可再次封装一个对象类型,公司引用2个对象即可
1、类型定义
@Data
@Entity
public class CompanyInfo {
@Id
@GeneratedValue
private long id;
private String name;
private ManageInfo registerInfo;
private ManageInfo yunInfo;
}
//@Embeddable表示当前对象是可以嵌入到其他Entity对象中的
@Data
@Embeddable
public class ManageInfo {
private String personName;
private String address;
private double money;
}
2、persistence.xml
<class>com.hongying.entity.embad.CompanyInfo</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
3、保存测试
@Test
public void save(){
ManageInfo m1=new ManageInfo();
m1.setPersonName("小明");
m1.setAddress("杭州芜湖街道01");
m1.setMoney(5000);
ManageInfo m2=new ManageInfo();
m2.setPersonName("大鹏");
m2.setAddress("杭州科技大厦C座9室");
m2.setMoney(8000);
CompanyInfo companyInfo=new CompanyInfo();
companyInfo.setName("杭州科技公司");
companyInfo.setRegisterInfo(m1);
companyInfo.setYunInfo(m2);
//保存
EntityManager entityManager = JpaUtil.getEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(companyInfo);
entityManager.getTransaction().commit();
entityManager.close();
}
4、执行报错
在创建表时,提示错误有重复的列名称 address
。出现这个错误是引用管理信息都有相同的字段名称,创建表时,都会添加到公司表中,从而导致错误。如何解决?
只需要把其中一个引用对象的字段名称映射表列名称时,进行修改即可
Repeated column in mapping for entity: com.hongying.entity.embad.CompanyInfo column: address (should be mapped with insert="false" update="false")
at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:696)
5、嵌入类型 列名称修改@AttributeOverrides
@Data
@Entity
public class CompanyInfo {
@Id
@GeneratedValue
private long id;
private String name;
private ManageInfo registerInfo;
//把属性映射的列名称进行重写
@AttributeOverrides(
{
@AttributeOverride(name = "personName",column = @Column(name = "yun_personName")),
@AttributeOverride(name = "address",column = @Column(name = "yun_address")),
@AttributeOverride(name = "money",column = @Column(name = "yun_money"))
}
)
private ManageInfo yunInfo;
}
6、嵌入类型使用注意
- 嵌入类型不需要
@Entity
,只需要@Embeddable
- 嵌入类型不需要交给JPA管理,JPA通过@Entity属性会自动管理。也就是说persistence.xml中class里面即使不配做这个嵌入类型也是可以的