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
分享到:
相关推荐
在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...
这篇博客将深入探讨JPA中的一对多双向关联以及级联操作。 首先,让我们理解一对多关联。假设我们有两个实体,一个是`User`(用户)和一个是`Post`(帖子)。一个用户可以发布多个帖子,但一个帖子只能属于一个用户...
本讲解将深入探讨JPA中的一对一双向关联特性,帮助开发者更好地理解和应用这一功能。 一对一双向关联是指在两个实体类之间存在一对一的关系,并且双方都能直接访问对方。这种关联关系在现实世界的例子中很常见,...
本资料主要探讨了JPA中的一对一双向关联,这是一个重要的概念,对于理解和优化数据模型设计至关重要。 一对一双向关联是指在两个实体类中,每个实体都可以直接引用对方,形成双向的关系。例如,一个学生可以对应一...
总结来说,JPA中的多对多双向关联实体定义涉及`@ManyToMany`、`@JoinTable`以及`mappedBy`等注解的使用。正确配置这些注解可以让我们轻松地管理实体之间的复杂关系,并简化数据库操作。在实际项目中,理解并熟练掌握...
4. **注解细节**:`@JoinColumn`用于单向一对一或一对多关系,而在多对多关系中,通常使用`@JoinTable`来指定中间表的信息,包括表名、连接列等。 5. **操作关联**:在JPA中,可以通过添加或移除对象到集合属性来...
在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联关系。 首先,我们需要定义两个实体,一个是"一"的一端,另一个是"多"的一端。假设我们有`Department`(部门)和`Employee`(员工)两个实体。在`...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第12讲 JPA中的一对一双向关联.avi
本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...
本资料“13_JPA详解_JPA中的多对多双向关联实体定义与注解设置”专注于讲解JPA如何处理多对多双向关联关系,这是数据库设计中常见的一种复杂关联类型。下面我们将详细探讨这一主题。 首先,我们需要理解多对多关联...
本教程将深入探讨JPA中的一对多双向关联及级联操作,这对于理解和使用JPA进行复杂数据模型管理至关重要。 首先,我们来理解一下一对多关联。在数据库设计中,一对多关联是指一个实体(表)可以与多个其他实体相关联...
本教程将深入探讨JPA中多对多双向关联的各个方面及其操作。 在数据库中,多对多关联意味着一个实体可以与多个其他实体相关联,反之亦然。例如,学生和课程之间的关系就是一个典型的多对多关系:一个学生可以选修多...
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用对象持久化的开发工作,实现ORM的统一。JPA详解视频教程 第10讲 JPA中的一对多双向关联与级联操作.avi
总结来说,JPA中的多对多双向关联提供了一种灵活的方式来处理实体间的复杂关系。正确理解和使用这些关系操作,可以帮助开发者构建出高效且易于维护的Java应用程序。在实际开发中,应根据需求选择合适的关联类型和...
总的来说,JPA的`@OneToOne`注解提供了处理一对一关联的强大工具,尤其是在处理双向关联时。正确理解和使用这些关联,能够帮助我们更好地进行对象与数据库之间的映射,提高代码的可读性和维护性。在实际项目中,应...
本篇文章将聚焦于JPA中的一对一(OneToOne)关联映射的实例配置,这在处理两个实体之间一对一关系时非常有用。 在一对一关联中,一个实体对应另一个实体的唯一实例。这种关系可以通过在实体类中定义注解来实现。JPA...
双向的一对一关联则需要在两个实体上都进行配置,但只有一个方向是“拥有”关系,用`@OneToOne(cascade=CascadeType...)`来指定级联操作。 4. **一对多关联(JPAOneToMany)** 一对多关联意味着一个实体可以与多个...
本文将深入探讨在JPA中如何实现双向多对多的关联关系,并提供相关的示例代码。 首先,我们需要了解多对多关联关系的基本概念。在关系型数据库中,两个实体之间可能存在多对多的关系,意味着每个实例可以从一个实体...
在Java Persistence API(JPA)中,双向一对一(OneToOne)关系是一种常见的实体关联类型,它允许两个实体之间存在一对一的映射关系,并且这种关系是双向的,即每个实体都可以通过其自己的属性引用另一个实体。...