IDCard.java
package cn.itcast.bean;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class IDCard {
private Integer id;
private String cardNo;
private Person person;
public IDCard() {
}
public IDCard(String cardNo) {
this.cardNo = cardNo;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 18,nullable=false)
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
@OneToOne(mappedBy = "idCard", cascade = { CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REFRESH } /*,optional = false*/)
public Person getPerson() {
return person;
}
/*
mappedBy:如何把IDCard指定为关系被维护端? 就是通过这属性。使用了这属性的类,就是关系被维护端。被维护端没有权力去更新外键字段。
cascade:
CascadeType.REMOVE:删除身份证,需要把这个人干掉吗? 不用,所以这个属性不设。
CascadeType.PERSIST:一出生就有身份证号。
CascadeType.MERGE:在游离状态的时候,修改了身份证号码,需要对人员的信息进行修改么?如果有这种业务需求,就设上去。
CascadeType.REFRESH:重新获取idCard的数据的时候,需不需要获取person的数据呢?
这些级联的定义,一定是根据你们的业务需求来定的。用不用是根据你的业务来决定的,业务需要就用,业务不需要就不用。
optional:是否可选,是否允许为null?反映在业务上,就是有身份证,是否一定要有这个人呢?
因為在Person里已经指定了idCard是必须要存在的,外键由person表维护,那么这里这个属性就是可选的的。设不设置这个person属性都行。那么在这里option这属性就可以不再进行设置了,不设置不对我们的数据构成任何影响,person可有可无不对关系(外键)存在影响。
外键由Person的option属性决定,就算你设置了这属性,其实它也不看你这属性。在设外键字段是否允许为空的时候,也不看这属性,而是看关系维护端的设定。
fetch:加载行为默认为立刻记载,凭one。
*/
public void setPerson(Person person) {
this.person = person;
}
}
Person.java
package cn.itcast.bean;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
@Entity
public class Person {
private Integer id;
private String name;
private IDCard idCard;
public Person() {
}
@Id
@GeneratedValue
// 采用数据库Id自增长方式来生成主键值。
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 10, nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "idCard_id")
public IDCard getIdCard() {
return idCard;
}
public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}
public Person(String name) {
this.name = name;
}
}
OneToOneTest.java
package junit.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import cn.itcast.bean.IDCard;
import cn.itcast.bean.Person;
public class OneToOneTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test
public void save() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("itcast");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person("老张"); // person是关系维护端。
person.setIdCard(new IDCard("1112222")); // 通过person把idCard放进去,这关系就由person来维护了。
em.persist(person); // 先保存idCard,得到保存记录的id,用id作为外键的值,再保存person。因为person表里的外键值是idcard表里面的主键,只有先生成主键值才有外键值。
em.getTransaction().commit();
em.close();
factory.close();
}
}
谁是关系维护端,谁就负责外键字段的更新。
Person是关系维护端,IDCard是关系被维护端,怎么维护更新呢?往Person里面设置idCard,这样就相当于把关系建立起来了;如果通过IDCard设置person的话,那么这种关系是建立不起来的,因为IDCard是关系被维护端
idcard表结构,看图:
person表结构,看图:
- 大小: 31.6 KB
- 大小: 31.5 KB
分享到:
相关推荐
12_JPA详解_JPA中的一对一双向关联.zip 12_JPA详解_JPA中的一对一双向关联.zip
NULL 博文链接:https://1028826685.iteye.com/blog/1525683
12_传智播客JPA详解_JPA中的一对一双向关联.rar
JPA中的一对多双向关联与级联操作
13_传智播客JPA详解_JPA中的多对多双向关联实体定义与注解设置.rar
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第12讲 JPA中的一对一双向关联.avi
10_JPA详解_JPA中的一对多双向关联与级联操作.zip
10_传智播客JPA详解_JPA中的一对多双向关联与级联操作.rar
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi
这是本人观看传智的视频,整理出来的完整的源码,及学习步骤,学了总会忘记,方便今后复习。代码可以直接运行,jar包完整,资源较大,分几块分享(1-5,按照学习步骤写的)。
JPA视频_映射双向一对一的关联关系 · 16. JPA视频_映射双向多对多的关联关系 · 17. JPA视频_二级缓存 · 18. JPA视频_JPQL_HelloWorld · 19. JPA视频_JPQL_查询缓存 · 20. JPA视频_JPQL_ORDER BY 和 GROUP...
映射单向多对一、单向一对多、双向一对一、双向多对一和双向多对多关联关系的具体实现
Hibernate一对多关联双向关联代码实现分享,大家参考使用吧
熟练使用JPA的关联映射 多对一,一对多单向 双向多对一关联 双向一对一关联 双向多对多关联 会使用JPA的二级缓存
ORM 映射增强特性,包括:支持通过使用 @ElementCollection 标注来增强 collections, maps 和 lists( 这里不是指实体之间的关联关系 ) 集合,支持 map 的单向 one-to-many 关联 (JPA1.0 只允许双向 one-to-many ...
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
这个项目包括5个实体,这5个实体之间具有复杂的关联关系,而且业务逻辑也相对复杂,希望让读者理论联系实际,真正将jsf+ejb 3+jpa整合真正运用到实际开发中。该案例采用目前最流行、最规范的java ee架构,整个应用...
一对多双向关系映射带有Spring Boot的Java Web Services和RESTful API 本教程将引导您完成使用Spring Boot,Spring Data JPA,Lombok,H2和Swagger映射JPA / Hibernate一对多双向关系的步骤。 下表关系图说明了此...
7.1.2 一对一的外键关联 7.1.3 用联结表映射 7.2 多值的实体关联 7.2.1 一对多关联 7.2.2 多对多关联 7.2.3 把列添加到联结表 7.2.4 映射map 7.3 多态关联 7.3.1 多态的多对一...