您的位置:首页 > 其它

JPA开发总结<三>--一对多双向关联

2015-01-03 11:23 375 查看
学习JPA规范,也会涉及到关联关系的操作,对于使用注解方式的关联操作,这点就不如使用XML思路清晰明了,下面这是我总结的操作代码,注释说明很清楚,需要重点提的就是这里所有引得包都是sun提供的工具包,即javax.persistence.*,避免引包错误。

一对多关联从两点入手学习:JPA中的一对多双向关联与级联操作

JPA中的一对多延迟加载与关系维护

我们分析一对多,典型的例子就是订单和订单项的关系,一个订单有多个订单项,一个订单项指定一个订单id,详细看代码:

首先是Order类:

/**
* JPA双向一对多关系的一的一端
*/
@Entity
@Table(name="t_order")
public class Order {

@Id @Column(length=12)
private String orderId;//人为赋值

@Column(nullable=false)
private Float amount = 0f;
/**
* 要想CascadeType.PERSIST生效,必须调用refresh()方法
* 要想CascadeType.PERSIST生效,必须调用persist()方法
* 要想CascadeType.MERGE  生效,必须调用merge()  方法
* 要想CascadeType.REMOVE 生效,必须调用remove() 方法
*
* FetchType.LAZY:延迟加载,必须保证EntityManager处于打开状态
* FetchType.EAGER:立即加载
* 如果To后面的是Many,那么不管To前的是什么,默认的是lazy加载策略(如OneToMany, ManyToMany)
* 反之,如果To后面的是One,那么默认的加载策略为eager立即加载
*
* mappedBy:哪个类出现了mappedBy,这个类就是关系的被维护端
* @return
*/
@OneToMany(cascade=CascadeType.ALL,mappedBy="order")
private Set<OrderItem> items = new HashSet<OrderItem>();

public void addItems(OrderItem item){
item.setOrder(this);//必须加上这句,因为关系的维护者是OrderItem
this.items.add(item);
}
<!--get,set方法省略。。 -->

}


然后是OrderItem代码:

/**
* JPA双向多对一关系的多的一端,
* JPA规范规定:如果是双向的一对多关系,多的一方为关系维护端。
* 关系维护端负责外键记录的更新,关系被维护端没有权利更新外键字段
*/
@Entity
@Table(name="t_orderItem")
public class OrderItem {

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;

@Column(length=40,nullable=false)
private String productName;

@Column(nullable=false)
private Float productPrice;
/**
* 如果To后面的是One,那么默认的加载策略为eager立即加载
* optional表示该属性是不是可选的,即是否可以为null。(true表示可选,false表示不可选,即该对象必须存在)
*
* JoinColumn表示外键
* @return
*/
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
@JoinColumn(name="order_id")
private Order order;

public OrderItem() {
}

public OrderItem( String productName) {
this.productName = productName;
}
<!-- set,get省略。。-->
}

最后编写测试类,使用Junit4.0测试:

public class OneToMany {

private static EntityManagerFactory factory;
private static EntityManager em;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
factory = Persistence.createEntityManagerFactory("jpatest1");
em= factory.createEntityManager();
}

@Test
public void saveOrder(){
em.getTransaction().begin();
Order order = new Order();
order.setOrderId(UUID.randomUUID().toString().substring(0, 12));
order.setAmount(120f);

OrderItem item1 = new OrderItem();
item1.setProductName("衣服");
item1.setProductPrice(110f);

OrderItem item2 = new OrderItem();
item2.setProductName("零食");
item2.setProductPrice(10f);

order.addItems(item1);
order.addItems(item2);
//保存Order,不需要保存OrderItem,因为Order设置了级联保存
em.persist(order);
em.getTransaction().commit();
em.close();
factory.close();
}
}
一对多整理到这,大体操作学习完毕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: