JPA中的一对多双向联系关系与级联操作

JPA中的一对多双向关联与级联操作
在编写程序前导入相应的*.jar包已经数据库的驱动包,配置persistence.xml配置文件

JPA规范:一对多 多的一方为关系维护端 它们互相持有对方的引用  谁是关系维护端谁负责外键维护,被维护端没有权利对外键操作 外键在关系维护端


<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<!-- 以transaction-type下是 事务提交类型有两种事务:第一、本地事务(在同一个数据库中完成事务)  第二、全局事务(在不同数据库中需要在同一事务中完成不同数据库的操作)-->
<persistence-unit name="person" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 使用的方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" />
<!-- 数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!-- 数据库密码 -->
<property name="hibernate.connection.password" value="liyong" />
<!-- 数据库连接url -->
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/student?useUnicode=true&amp;characterEncoding=UTF-8" />
<!-- 表结构发生变化的时候更新表结构 ,表不存在是创建表-->
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>



本例来自itcast

第一步:编写一个Order。java和OrderItem.java

Order。java

@Entity
@Table(name="orders")
public class Order {

private String orderId;
private Float account=0f;
private Set<OrderItem> orderItem=new HashSet<OrderItem>();

/** CascadeType.REFRESH 级联刷新
*  CascadeType.PERSIST 级联插入,只有在调用persist方法时才有作用
*  CascadeType.MERGE 级联更新,只有在调用merge方法时才有作用
*  CascadeType.REMOVE 级联删除,只有在调用remove方法时才有作用
*  CascadeType.All 包括全部
*  fetch=FetchType.LAZY延迟加载(在many情况下,默认是延迟加载,在one情况下,默认是立即加载)
*  mappedBy="order"表示这个类是 关系被维护端,指明该实体内被维护的属性为order
**/
@OneToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH,CascadeType.REMOVE},fetch=FetchType.LAZY,mappedBy="order")

public Set<OrderItem> getOrderItem() {
return orderItem;
}
public void setOrderItem(Set<OrderItem> orderItem) {
this.orderItem = orderItem;
}
@Id @Column(length=10)
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;
}

public void addOrderItem(OrderItem orderItem)
{
orderItem.setOrder(this);
this.orderItem.add(orderItem);
}
}


OrderItem.java

@Entity
public class OrderItem {

private String produce;
private Float priceProduce=0f;
private Integer id;
private Order order;

@Column(length=20,nullable=false)
public String getProduce() {
return produce;
}
public void setProduce(String produce) {
this.produce = produce;
}
@Column(nullable=false)
public Float getPriceProduce() {
return priceProduce;
}
public void setPriceProduce(Float priceProduce) {
this.priceProduce = priceProduce;
}
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
/**
     * 多的一方不需要 级联保存,不需要级联删除
     * optional=true表示可选,表示此项可以为空
**/
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=true)
@JoinColumn(name="oerder_id")//外键名称order_id
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}


}

第二步:编写单元测试

@Test
public void save()
{
EntityManagerFactory factory=Persistence.createEntityManagerFactory("person");
EntityManager entity=factory.createEntityManager();
entity.getTransaction().begin();

Order order=new Order();
order.setAccount(100f);
order.setOrderId("111");

OrderItem orderItem=new  OrderItem();
orderItem.setPriceProduce(300f);
orderItem.setProduce("篮球");

OrderItem orderItem1=new  OrderItem();
orderItem1.setPriceProduce(300f);
orderItem1.setProduce("足球");

order.addOrderItem(orderItem);
order.addOrderItem(orderItem1);

entity.persist(order);
entity.getTransaction().commit();
entity.close();
factory.close();
}

第三:运行单元测试生成表结构两张表见数据库

代码见附件: