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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值