欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-12 17:45:37
...

多对一关联关系

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("[email protected]");
		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);

相关标签: JPA ManyToOne