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

整理完了一对多的关联关系,下面咱们来看看一对一的关联配置情况,重点还是在于分清楚关系维护方和关系被维护方,然后在具体操作,在个就是cascade=CascadeType的维护方式,没必要的级联尽量不要,否则会造成不必要的结果。

在一对一中的例子中,我们分析人和身份证号的关系,一个人只能有一个身份证号,而且伴随着人死亡而失效,至于人是否出生就有身份证号我们不深究,这里理解为不是,无关影响。那具体操作看代码:

定义人对象类,让身份证号做被维护者:

/**
 * JPA双向一对一关联,Person作为关系的维护端
 */
@Entity
@Table(name="t_people")
public class People {
	@Id 
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@Column(length=20,nullable=false) 
	private String name;
	/**
	 * 在关系的维护端定义外键,optional为false表示不能为空
	 */
	@OneToOne(cascade=CascadeType.ALL,optional=false)
	private IDCard idCard;

	public People() {
	}

	/**方便实例化对象 **/
	public People(String name) {
		this.name = name;
	}

<!--方法省略。。。 -->
}

身份证号代码如下:

/**
 * JPA双向一对一关联,IDCard作为关系的被维护端
 */
@Entity
@Table(name="t_idcard")
public class IDCard {
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer id;
	
	@Column(length=18,nullable=false)
	private String cardNo;
	/**
	 * mappedBy出现的类即为关系的被维护端
	 * 因为在Person端指定了IDCard不允许为空,即外键不能为空,所以IDCard必然会有Person,所以不用再指定optional
	 * @return
	 */
	@OneToOne(mappedBy="idCard",cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH})
	private People people;

	public IDCard() {
	}

	public IDCard(String cardNo) {
		this.cardNo = cardNo;
	}

<!-- 方法省略。。。-->
}

测试代码:

public class OneToOne {

	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 savePeople(){
		em.getTransaction().begin();
		People p = new People("zebra");
		IDCard id = new IDCard("12345678");
		
		p.setIdCard(id);
		//因为对Person设置了级联保存,所以不需要对IDCard进行保存
		em.persist(p);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

}
代码很简单,不做太多说明。。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值