使用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();
}
}
测试结果: