`

JPA 一对一关联

阅读更多
在一对一关联中,JPA没有规定谁为关系的维护方,OneToOne的mapped属性值指定了由另外一方实体的某个属性来维护一对一关联。以Person和IDCard为例。

Person类:
@Entity
@Table(name="pillow")
public class Person {
	private Integer id;
	private String name;
	private IDCard idcard;
	public Person() {
	}
	public Person(String name) {
		this.name = name;
	}
	@Id @GeneratedValue
	public Integer getId() {
		return id;
	}
	@Column(length=20, nullable=false)
	public String getName() {
		return name;
	}
	@OneToOne(cascade={CascadeType.ALL},optional=false) // optional specified to false means the corresponding column couldn't be nullable
	@JoinColumn(name="idcard_id") // Indicate the column name of the foreign key
	public IDCard getIdcard() {
		return idcard;
	}
	// Setters are omitted
}


@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;
	}
	@Column(length=18, nullable=false)
	public String getCardno() {
		return cardno;
	}
	// mappedBy specifies the property of the corresponding class that maintains the relationship. Also indicates this entity is the maintained edge.
	@OneToOne(mappedBy="idcard", cascade={CascadeType.REMOVE, CascadeType.MERGE, CascadeType.REFRESH},
			optional=false, fetch=FetchType.EAGER) // Maintained edge
	public Person getPerson() {
		return person;
	}
	// Setters are omitted
}


1. 测试保存
	public void save() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
		EntityManager em = factory.createEntityManager();
		Person person = new Person("Johnson");
		IDCard idcard = new IDCard("330818198602260444");
		// idcard.setPerson(person);
		person.setIdcard(idcard);
		em.getTransaction().begin(); // It's mandatory to open transaction to insert, update or delete data.
		em.persist(person);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}


当IDCard的person属性的optional为true时,上面的idcard.setPerson(person)可以省略,因为Person既设置了级联属性cascade={CascadeType.ALL},在保存Person实体的时候也会保存IDcard,又是关系的维护方,在它们之间建立关联。如果为false,在先保存idcard时候,由于not null约束,程序报错。


2. 测试更新:
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		IDCard idcard = em.find(IDCard.class, 1);
		idcard.setCardno("330624198802060168");
//		em.merge(idcard);
		em.getTransaction().commit();
		em.close();
		factory.close();

em.merge(idcard)可以省略,因为idcard已经是托管态了,对它的修改在commit的时候都会提交到数据库。如果idcard是游离态则需要该语句。


3. 测试查询:
	public void queryFromMaintained() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
		EntityManager em = factory.createEntityManager();
		IDCard idcard = em.find(IDCard.class, 1);
		em.close();
		factory.close();
		System.out.println(idcard.getCardno());
		System.out.println(idcard.getPerson().getName());
	}

因为IDCard实体的person属性设置了fetch=FetchType.EAGER,jpa会使用一个SELECT连表查询出Person和IDCard。
如果fetch设置为FetchType.LAZY,jpa会使用两个SELECT语句(第一个查询出IDCard,第二个连表查询),不会产生EntityManager关闭导致的问题。


4. 测试删除:
	public void deleteFromMaintained() {
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("refrigerator");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		IDCard idcard = em.find(IDCard.class, 1);
		em.remove(idcard);
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

当IDCard的person属性的optional为true时,能删除成功;为false时删除会报错:org.hibernate.PropertyValueException: not-null property references a null or transient value: com.john.bean.Person.idcard
分享到:
评论

相关推荐

    JPA中的一对一双向关联

    在Java Persistence API (JPA) 中,一对一双向关联是一种关系映射,它允许两个实体类之间存在一对一的关系,并且每个实体都能引用对方。这种关联是双向的,意味着每个实体都可以通过自己的属性访问到另一个实体。...

    JPA_3_一对一关联关系源码

    **JPA 一对一关联关系源码详解** Java Persistence API (JPA) 是Java平台上的一个标准,用于管理和持久化对象到数据库。它提供了一种面向对象的方式来操作数据库,简化了数据库编程。在JPA中,一对一(OneToOne)...

    JPA一对一关系实例配置

    本实例将详细探讨JPA中的一对一(OneToOne)关系配置,以及如何在实际项目中实现。 一对一关系在数据库设计中意味着两个实体之间存在一个实体对应另一个实体的唯一关系。例如,一个人可能只有一个护照,或者一个...

    JPA 一对一实例配置

    接下来,我们将深入探讨如何配置和使用JPA的一对一关联。 首先,我们需要创建两个实体类,例如`Person`和`Profile`。`Person`可能包含基本信息,如姓名和年龄,而`Profile`可能包含更详细的信息,如地址和电话号码...

    JPA一对一,一对多,多对多关系映射

    本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...

    JPA实体关联(hibernate实现)

    双向的一对一关联则需要在两个实体上都进行配置,但只有一个方向是“拥有”关系,用`@OneToOne(cascade=CascadeType...)`来指定级联操作。 4. **一对多关联(JPAOneToMany)** 一对多关联意味着一个实体可以与多个...

    JPA_2_一对多双向关联关系

    **JPA 2 一对多双向关联关系** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式操作数据库。在JPA中,一对多关联关系是常见的实体间关系类型...

    JPA中的多对多双向关联实体定义与注解设置

    在Java Persistence API (JPA) 中,多对多(ManyToMany)关系是表示两个实体之间复杂关联的一种方式。这种关联允许一个实体实例可以与多个其他实体实例相关联,反之亦然。例如,一个学生可以选修多门课程,一门课程...

    13_jpa多对多双向关联实体定义与注解

    4. **注解细节**:`@JoinColumn`用于单向一对一或一对多关系,而在多对多关系中,通常使用`@JoinTable`来指定中间表的信息,包括表名、连接列等。 5. **操作关联**:在JPA中,可以通过添加或移除对象到集合属性来...

    12_传智播客JPA详解_JPA中的一对一双向关联

    默认情况下,一对一关联是急加载,可以通过`@OneToOne(fetch = FetchType.LAZY)`设置为懒加载,以提高性能。 3. **数据一致性**:由于双向关联可能导致数据不一致,因此在处理关联关系时需要特别小心,确保两边的...

    JPA关联关系

    在一对一关联中,一个实体实例对应数据库中的唯一一行。这种关系可以用@OneToOne注解来表示,它可以是单向或双向的。例如,一个用户可能只有一个账户,账户实体和用户实体之间就是一对一的关系。可以通过设置mapped...

    12_JPA详解_JPA中的一对一双向关联.zip

    本资料主要探讨了JPA中的一对一双向关联,这是一个重要的概念,对于理解和优化数据模型设计至关重要。 一对一双向关联是指在两个实体类中,每个实体都可以直接引用对方,形成双向的关系。例如,一个学生可以对应一...

    JPA一对多和多对一关系

    **JPA一对多和多对一关系详解** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式来操作数据库。在JPA中,实体间的关系映射是核心概念之一,...

    jpa 关联映射jpa 关联映射jpa 关联映射

    本文将深入探讨 JPA 中的一对一 (One-to-One)、一对多 (One-to-Many)、多对一 (Many-to-One) 和多对多 (Many-to-Many) 的关联映射。 #### 二、实体关系映射概述 在领域模型中,实体间的关系可以是: - **一对一 ...

    JPA中的一对多双向关联与级联操作

    在Java Persistence API (JPA) 中,一对多关联是一种常见的关系映射,它表示一个实体可以与多个其他实体相关联。这种关联在数据库层面通常通过外键实现,而在JPA中,我们通过注解来配置这种关系。这篇博客将深入探讨...

    Hibernate annotation JPA 一对多,多对多

    在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...

    JPA学习总结(二)--JPAOneToOne双向关联

    本文主要探讨的是JPA中的`@OneToOne`注解,它用于建立两个实体之间的一对一关联关系。在实际开发中,这种关联关系常常出现在需要精确映射一对一实体映射的情况,例如用户与个人信息、车辆与车牌号等。我们将会深入...

    JPA中,多个表相关联设定的方法。

    1. **一对一关联(OneToOne)**:在实体之间,如果一个实体对应另一个实体的唯一实例,那么就存在一对一关联。在JPA中,可以使用`@OneToOne`注解来表示这种关系。然而,这段代码并未直接展示一对一关联的例子。 2. **...

    一对一关联

    一对一关联(OneToOne)在关系型数据库设计中是一种常见的实体关系模型,用于表示两个表之间的一种强关联,其中一张表的某条记录唯一对应另一张表的一条记录。这种关联通常通过外键(Foreign Key)来实现,确保数据...

    10_JPA详解_JPA中的一对多双向关联与级联操作.zip

    本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...

Global site tag (gtag.js) - Google Analytics