JPA——单向一对多

在JPA中,用@OneToMany来标识一对多的关系。实现一对多的单向关联,只需在代表一的实体中使用@OneToMany映射标注就可以了,代表多的实体不需要使用任何映射标注。

  有两种方式实现一对多的单向关联。一种是在只使用@OneToMany来标识,这种方式是通过一张第三方表来保存关系。还有一种是使用@OneToMany和@JoinColumn来标注,这种方式是在多的一方的表中增加一个外键列(对应一的一方的id)来保存关系。


方式一:

Orders.java    一的一方

在一的一方设置

private Set<OrderItem> items = new HashSet<OrderItem>();
并注解

package com.olay.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;



@Entity
@Table(name="MyOrder")
public class Orders  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String orderid;
	private float account=0f;
	private Set<OrderItem> items = new HashSet<OrderItem>();

	@Id @Column(length=50)
	public String getOrderid() {
		return orderid;
	}

	public void setOrderid(String orderid) {
		this.orderid = orderid;
	}

	@Column(nullable=false)
	public float getAccount() {
		return account;
	}

	public void setAccount(float account) {
		this.account = account;
	}

	

	@OneToMany(cascade=CascadeType.ALL)
	@JoinTable(name="order_orderitem",
	joinColumns=@JoinColumn(name="orderid"),
	inverseJoinColumns=@JoinColumn(name="orderitemid"))
	public Set<OrderItem> getItems() {
		return items;
	}

	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}
}


@JoinTable(name="order_orderitem",
    joinColumns=@JoinColumn(name="orderid"),
    inverseJoinColumns=@JoinColumn(name="orderitemid"))

这是自定义第三张表,表名为order_orderitem。列名orderid,joinColumns为与一的一方的id对应。列名orderitemid,inverseJoinColumns为与多的一方的id相对应(两表之间就是通过此表相关联).    如果没有添加此代码,系统会默认一张关联表(表名为两表的表名用下划线连接作为关联表的表名),但是为了更好的找到和操作这表,我们最好是自定义她



Orderitem.java   多的一方

package com.olay.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;


@Entity
public class OrderItem  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String produceName;
	private float sellPrice=0f;
	

	@Id @GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(length=50,nullable=false)
	public String getProduceName() {
		return produceName;
	}

	public void setProduceName(String produceName) {
		this.produceName = produceName;
	}

	@Column(nullable=false)
	public float getSellPrice() {
		return sellPrice;
	}

	public void setSellPrice(float sellPrice) {
		this.sellPrice = sellPrice;
	}

	

	
	

}

生成的表如下:




方式二:

这种方法没有产生第三张表,而是在多的一方的表上增加了外键(与一的那方的id对应)


Order.java   一的一方

package com.olay.entity;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;



@Entity
@Table(name="MyOrder")
public class Orders  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String orderid;
	private float account=0f;
	private Set<OrderItem> items = new HashSet<OrderItem>();

	@Id @Column(length=50)
	public String getOrderid() {
		return orderid;
	}

	public void setOrderid(String orderid) {
		this.orderid = orderid;
	}

	@Column(nullable=false)
	public float getAccount() {
		return account;
	}

	public void setAccount(float account) {
		this.account = account;
	}

	

	@OneToMany(cascade=CascadeType.ALL)
	@JoinColumn(name="orders_id")
	public Set<OrderItem> getItems() {
		return items;
	}

	public void setItems(Set<OrderItem> items) {
		this.items = items;
	}
}

@JoinColumn(name="orders_id")
这个的作用的在多的一方的表中添加一个字段:orders_id,这个字段与一的一方的id相对应,因此建议名字为一的那方的表名+id



OrderItem.java  多的一方

package com.olay.entity;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;


@Entity
public class OrderItem  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String produceName;
	private float sellPrice=0f;
	

	@Id @GeneratedValue
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Column(length=50,nullable=false)
	public String getProduceName() {
		return produceName;
	}

	public void setProduceName(String produceName) {
		this.produceName = produceName;
	}

	@Column(nullable=false)
	public float getSellPrice() {
		return sellPrice;
	}

	public void setSellPrice(float sellPrice) {
		this.sellPrice = sellPrice;
	}

	

	
	

}
 

生成的表为:



注意:记得添加它们的级联关系

@OneToMany(cascade=CascadeType.ALL)


保存数据:

package com.olay.junit;

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.olay.entity.OrderItem;
import com.olay.entity.Orders;

import junit.framework.TestCase;

public class OneToMany extends TestCase {
	public void test(){
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("olayjpa");
		EntityManager em=emf.createEntityManager();
		em.getTransaction().begin();
		OrderItem oi1 = new OrderItem();
		oi1.setProduceName("足球1");
		oi1.setSellPrice(90f);
		
		OrderItem oi2 = new OrderItem();
		oi2.setProduceName("篮球1");
		oi2.setSellPrice(80f);
		
		Set items = new HashSet();
		items.add(oi1);
		items.add(oi2);
		
		Orders orders = new Orders();
		orders.setOrderid(UUID.randomUUID().toString());
		orders.setAccount(345);
		orders.setItems(items);
		
		em.persist(orders);
		//em.persist(oi2);
		em.getTransaction().commit();
		emf.close();
	}

}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值