您的位置:首页 > 其它

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

2015-01-03 19:26 363 查看
整理完了一对多的关联关系,下面咱们来看看一对一的关联配置情况,重点还是在于分清楚关系维护方和关系被维护方,然后在具体操作,在个就是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();
}

}
代码很简单,不做太多说明。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: