在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();
}
}