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

学习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省略。。-->
}<span style="font-family:Microsoft YaHei;font-size:14px;">
</span>

最后编写测试类,使用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();
	}
}

一对多整理到这,大体操作学习完毕。

时间: 2024-10-12 19:40:36

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

Hibernate 一对多双向关联Demo

以Classes[班级]和Student[学生]为例的Demo //Classes.java public class Classes implements Serializable { private long cid; private String cname; private String cdesc; private Set<Student> students; //get和set } //Student .java public class Student implements Se

hibernate一对多双向关联

14.一对多双向关联 1.在多的一方关联一的一方,多的一方直接维护了关系,所以多的一方没有inverse属性,多的一方在保存自己的时候直接保存了外键,效率高. 2.建立关系和保存对象,可以对应两个映射文件,保存多的一方自己对应自己的映射文件,建立关系可以使用一的一方表的inverse属性.这样发出update语句,效率低了.一对多,从多的一方建立关系,效率高. 例子 在student这边保存属性private Classess classess; 在student.hbm.xml文件在<clas

Hibernate中用注解配置一对多双向关联和多对一单向关联

Hibernate中用注解配置一对多双向关联和多对一单向关联 Hibernate提供了Hibernate Annotations扩展包,使用注解完成映射.在Hibernate3.3之前,需单独下载注解开发包 配置持久化类 配置关联关系 下面我们先从多对一单向关联关系讲起,多对一单向关联就是在多的一方植入一的一方的主键作为外键,下面我们先进行初始配置, 在配置的过程中我们会遇到一个问题  就是无论用load还是get都不会出现延迟加载,那么我们应该如何设置为要延迟加载,这样做的好处是可以在用的时候

grails一对多双向关联

前面分享了一些学习grails的心得,可是grails的知识还远不止这些,这次整理了一点有关grails一对多双向关联关系的知识.我认为这样的关联用的地方太多了,这次准备的样例是城市和区域的相关样例. 1.领域模型 class CityInfo { static hasMany = [area:AreaInfo] static fetchMode = [area:'lazy'] Integer id; String name; String code; static mapping = { ta

hibernate一对多双向关联中怎么配置list

假设有一个文档管理者类User,和一个文档类Archives.其中User和Archives是一对多双向关联关系 表现在类中如下(此处省略了属性的set和get方法) public class User implements Serializable { private static final long serialVersionUID = -7327980678002278494L; /** 定义id */ private Long id; /** 定义用户名*/ private Strin

15.Hibernate一对多双向关联映射+分页

1.创建如下数据库脚本 1 --创建用户信息表 2 --编号,用户名,密码,年龄,性别,昵称,手机,地址,管理员,图像地址 3 create table users 4 ( 5 id number(10) primary key, 6 username varchar2(20) not null, 7 password varchar2(40) not null, 8 age number(10) not null, 9 sex number(10) not null, 10 nickname

Mybatis一对多双向关联

在弄Mybatis的一对多关联的时候,不知道有没有遇到这样的问题,本来数据库中对应有多条数据,然而关联出来却只有一条数据,比如数据库中有个班级表和学生表,数据库中一个班级中对应了多个学生,但使用Mybatis做一对多关联的时候,查询出来的却只有一条.如果出现这样的问题,那么就是两张数据表中的主键重名了,导致在关联查询时分不清到底是那一张表了,因此有关联的数据表时,主键id不要重名,一对多关联实现如下: 数据表: CREATE TABLE tab_class ( c_id INT PRIMARY

Hibernate!!多对一与一对多双向关联映射

双向的时候必须制定MappedBy这个属性!防止数据库生成的冗余. MappedBy属性是设置在多的一方,即在数据库中,一般都是将属性设置在多的一方. 如果没有,那么在生成数据库表的时候,就会有两个外键如图: onetomany的例子如下 加入MappedBy这个属性的 例子: 1 package com.hb.model; 2 3 import java.util.Collection; 4 import java.util.HashSet; 5 import java.util.Iterat

MyBatis一对多双向关联——MyBatis学习笔记之七

处理has-one关系需要用到association元素,而处理has many关系则需要用到collection元素.例如本例中,假设一 名教师可同时指导多名学生,下面就来介绍如何使用collection元素来实现这种映射,具体的任务是查询出教师及其指导的多个学生的信息(本示例源代 码下载页面:http://down.51cto.com/data/490947). 一.为Teacher实体增加相关属性 为教师实体增加指导学生集合的属性如下: private List<Student> sup