当前位置: 代码迷 >> 综合 >> JPA单项多对一关联关系@ManyToOne
  详细解决方案

JPA单项多对一关联关系@ManyToOne

热度:80   发布时间:2023-10-26 08:55:31.0

多对一关联关系

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;}@Overridepublic String toString() {return "Order [oId=" + oId + ", oName=" + oName + ", customer=" + customer + "]";}}
         	@Testpublic 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);