JPA开发总结<三>--一对多双向关联
2015-01-03 11:23
375 查看
学习JPA规范,也会涉及到关联关系的操作,对于使用注解方式的关联操作,这点就不如使用XML思路清晰明了,下面这是我总结的操作代码,注释说明很清楚,需要重点提的就是这里所有引得包都是sun提供的工具包,即javax.persistence.*,避免引包错误。
一对多关联从两点入手学习:JPA中的一对多双向关联与级联操作
JPA中的一对多延迟加载与关系维护
我们分析一对多,典型的例子就是订单和订单项的关系,一个订单有多个订单项,一个订单项指定一个订单id,详细看代码:
一对多关联从两点入手学习: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(); } }一对多整理到这,大体操作学习完毕。
相关文章推荐
- JPA开发总结<五>--多对多双向关联
- JPA开发总结<四>--一对一双向关联
- JPA开发总结<六>--联合主键
- JPA开发总结<七>--Bug总结
- JPA开发总结<二>--基本操作+JPQL查询
- JPA开发总结<一>
- Android开发工具——ADB(Android Debug Bridge) <三>DalvikVM之jdwp线程
- Java总结<三>多线程
- 在线支付开发流程总结<包括客户端与服务端>
- EBS Form开发 弹性域定义中的参数<三>
- EBS OAF开发中的Java 实体对象(Entity Object)<三>
- <杂谈1002>HTML作为GUI前段,Java/NDK作为业务后端开发方式总结
- EBS Form开发 弹性域定义中的参数<三>
- ASP.NET MVC (Razor)开发 <<周报与绩效考核系统>> 总结与分享
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
- &lt;&lt;高效程序员的45个习惯-敏捷开发修炼之道&gt;&gt;总结
- iOS开发 两个视图之间值传递的常用方法<三>
- 友善官方<<Mini2440 Linux移植开发实战指南>>问题总结
- EBS Form开发 弹性域定义中的参数<三> .
- Orace数据库锁表的处理与总结<摘抄与总结三>