概述
jpa 里用注解进行关系映射
单向多对一关联
在 pojo 包下添加实体类 CustomerType.java
在 Customer 类中移除 typeId 属性,添加 CustomerType 属性
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="typeId" )
private CustomerType type;
测试用例:
@Test
public void testManyToOne() {
// EntitymanagerFactory
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("jpademo");
// MyBatis---SqlSession JPA --- EntityManager
EntityManager entityManager = factory.createEntityManager();
Customer customer= entityManager.find(Customer.class,1);
System.out.println(customer);
}
注意:注解@ManyToOne(fetch=FetchType.EAGER)默认的是立即加载,需要懒加载时候,要加 fetch 参数修改为 LAZY;可以使用 targetEntity 属性指定关联实体类型@ManyToOne(targetEntity=CustomerType.class)
单向一对多的关联
在 CustomerType.java 中添加 Customer 类型的集合属性
@OneToMany(targetEntity=Customer.class ,cascade = CascadeType.REMOVE)
@JoinColumn(name=”typeid”)
private Set<Customer> customers = new HashSet<>();
测试用例:
@Test
public void testOneToMany() {
// EntitymanagerFactory
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("jpademo");
// MyBatis---SqlSession JPA --- EntityManager
EntityManager entityManager = factory.createEntityManager();
CustomerType customertype= entityManager.find(CustomerType.class,1);
System.out.println(customertype.getId()+"==="+customertype.getTypeName());
System.out.println("================================");
Set<Customer> customers= customertype.getCustomers();
Iterator iterator= customers.iterator();
while(iterator.hasNext()){
Customer customer= (Customer) iterator.next();
System.out.println(customer.getId()+"==="+customer.getName());
}
}
注意:注解@OneToMany(fetch=FetchType.LAZY)默认的是懒加载,需要懒加载的候,要加 fetch 参数修改,使用@JoinColumn(name=“typeid”) 设置关联外键
双向的一对多的关联
CustomerType.java 中
@OneToMany(mappedBy = "type", fetch = FetchType.EAGER ,cascade = CascadeType.REMOVE)
private Set<Customer> customers = new HashSet<>();
CustomerType.java 中
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="typeId" )
private CustomerType type;
注意:
- 在 Customer.java 中使用 mappedBy 设置关联的外键属性,避免出现中间表
- 双向关联关系,两遍默认都会维护关系,可能冲突,也影响效率,正常情况关系交给“多”的一端维护,一的这端@OneToMany(mappedBy=“type”,这个属性放弃关系维护
- 一旦使用 mappedBy 属性,那么@JoinColumn 这个注解就不能使用了,用了会出错
测试用例:
@Test
public void testManyToMany() {
// EntitymanagerFactory
EntityManagerFactory factory =
Persistence.createEntityManagerFactory("jpademo");
// MyBatis---SqlSession JPA --- EntityManager
EntityManager entityManager = factory.createEntityManager();
CustomerType customertype= entityManager.find(CustomerType.class,1);
System.out.println(customertype.getId()+"==="+customertype.getTypeName());
System.out.println("================================");
Set<Customer> customers= customertype.getCustomers();
Iterator iterator= customers.iterator();
while(iterator.hasNext()){
Customer customer= (Customer) iterator.next();
System.out.println(customer.getId()+"==="+customer.getName());
}
}
向多对多的关联
在 pojo 包下添加实体类客户产品实体类 CustomerProduct.java 和产品实体类
Product.java 并加上 JPA 注解
Customer.java 类中添加 manytomany 注解
@ManyToMany
@JoinTable(name = "customer_product", joinColumns = {@JoinColumn(name =
"customer_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "product_id",
referencedColumnName = "id")})
private Set<Product> productItems = new HashSet<Product>();
解释: @JoinTable(name=“中间表”,joinColumns={@JoinColumn(name=“当前对象在中间表的外键名”,referencedColumnName="
当前对象表的主键")},
inverseJoinColumns={@JoinColumn(name="关联表在中间表的外键名
",referencedColumnName=“关联表的主键”)})
Customer 这边维护关系,Product 就要放弃关系的维护,使用 mappedBy 将维护权交给另外
一方。
Product.java 类中
@ManyToMany(mappedBy = "productItems")
private Set<Customer> customerItem=new HashSet<Customer>();
注意:在真项目开发中,我们处理双向多对多的关联,还可以变通来处理,就是将多对多关联,转换为两个一对多的关联
其他相关JPA知识及代码点此处
最后
以上就是爱听歌棒棒糖为你收集整理的JPA基础(五)之jpa里用注解进行映射的全部内容,希望文章能够帮你解决JPA基础(五)之jpa里用注解进行映射所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复