9、JPA对象关系-嵌入类型 @Embeddable-@AttributeOverrides

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、嵌入类型使用注意

  1. 嵌入类型不需要 @Entity ,只需要@Embeddable
  2. 嵌入类型不需要交给JPA管理,JPA通过@Entity属性会自动管理。也就是说persistence.xml中class里面即使不配做这个嵌入类型也是可以的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值