JPA单项多对一关联关系@ManyToOne
多对一关联关系
package com.jpa.helloworld; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="JPA_ORDER") @Entity public class Order { private Integer oId; private String oName; private Customer customer; @Id @Column(name="JPA_ID") @GeneratedValue(strategy=GenerationType.AUTO) public Integer getoId() { return oId; } public void setoId(Integer oId) { this.oId = oId; } @Column(name="O_NAME") public String getoName() { return oName; } public void setoName(String oName) { this.oName = oName; } //映射单向多对一关联关系 //使用@ManyToOne注解 映射多对一关联关系 //使用@JoinColumn 来映射外键 //这里的ManyToOne的fetch属性可以配置加载加载策略,有EAGER和LAZY @JoinColumn(name="CUSTOMER_ID") @ManyToOne(targetEntity=Customer.class,fetch=FetchType.EAGER) public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } @Override public String toString() { return "Order [oId=" + oId + ", oName=" + oName + ", customer=" + customer + "]"; } }
@Test public void testManyToOne() { Customer customer = new Customer(); customer.setName("XXX"); customer.setBirth(new Date()); customer.setEmail("123@163.com"); customer.setCreateDate(DateTime.now()); customer.setLastUpdateDate(LocalDate.now()); Order order1 = new Order(); Order order2 = new Order(); order1.setoName("CC"); order2.setoName("DD"); order1.setCustomer(customer); order2.setCustomer(customer); em.persist(order2); em.persist(order1); em.persist(customer); }
保存
建议在使用多对一关联关系保存对象时先保存一的一端
先保存一的一端:发送三条insert语句
先保存多的一端:发送三条insert语句和两条update语句
原因:当先保存多的一端时,多的一端的关联属性为null,当再保存一的一端时,会再次发送两条update语句来更新多的一端
性能上先保存一的一端要由于先保存多的一端
删除
删除时不能直接删除一的一端,可以删除多的一端
查询并修改一的一端的属性
Order order = em.find(Order.class, 4); order.getCustomer().setAge(23);