JPA_组件关系

使用JPA注解完成组件关系映射

以Company与Address为例。其中Address对象为组件对象,Company对象为宿主对象。

  • Company类
@Getter@Setter
@Entity@Table(name = "company")
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
       
    private Address address;        // 公司经营地址
    private Address regAddress;     // 公司注册地址


    private Company() {
    }

    public Company(String name, Address address, Address regAddress) {
        this.name = name;
        this.address = address;
        this.regAddress = regAddress;
    }

    @Override
    public String toString() {
        return "Company{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address=" + address +
                ", regAddress=" + regAddress +
                '}';
    }
}
  • Address类
@Getter@Setter@ToString
@Embeddable
public class Address {
    private String province;
    private String city;

    private Address() {
    }

    public Address(String province, String city) {
        this.province = province;
        this.city = city;
    }
}

Address作为组件对象,只需在类上打上@Embeddable注解即可。

Company对象中包含两个Address属性,为避免数据库表中的列名重复,需对其中的一个属性进行@AttributeOverrides注解的配置。

public @interface AttributeOverrides {
    AttributeOverride[] value();
}

阅读该注解源代码,可知配置多个@AttributeOverride需包装成数组。

@AttributeOverride的部分源代码如下

public @interface AttributeOverride {
    String name();

    Column column();
}

其中name属性即Address中的属性名,column属性即数据库表中的列名。

通过上述注解,进行配置(以下为配置部分代码,其余代码同上文):

@Getter@Setter@ToString
@Entity@Table(name = "company")
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    private Address address; // 无重复直接使用即可

    @AttributeOverrides({    // 对重复的列名进行配置
            @AttributeOverride(name = "province", column = @Column(name = "reg_province")),
            @AttributeOverride(name = "city", column = @Column(name = "reg_city"))
    })
    private Address regAddress;

    // 其余代码略
}
@Embeddable
public class Address {
    // 其余代码略
}

测试代码

1、持久化测试

public class ComponentTest {
    @Test
    public void testSave(){
        // 对象准备
        Address address = new Address("GuanDong", "GuanZhou");
        Address regAddress = new Address("GuanDong", "JianMen");
        Company company = new Company("WYU", address, regAddress);

        EntityManager em = JPAUtil.GetInstance().getEM();
        em.getTransaction().begin();

        // 持久化操作
        em.persist(company);

        em.getTransaction().commit();
        em.close();

    }
}

测试结果(数据库表):

2、查询测试

public class ComponentTest {
    @Before
    public void testSave(){
        // 对象准备
        Address address = new Address("GuanDong", "GuanZhou");
        Address regAddress = new Address("GuanDong", "JianMen");
        Company company = new Company("WYU", address, regAddress);

        EntityManager em = JPAUtil.GetInstance().getEM();
        em.getTransaction().begin();

        // 持久化操作
        em.persist(company);

        em.getTransaction().commit();
        em.close();

    }

    @Test
    public void testFind(){
        EntityManager em = JPAUtil.GetInstance().getEM();
        em.getTransaction().begin();
        
        Company company= em.find(Company.class, 1L);
        System.out.println(company);

        em.getTransaction().commit();
        em.close();

    }
}

测试结果:

猜你喜欢

转载自blog.csdn.net/hanaii/article/details/82356011
今日推荐