`
liujianguangaaa
  • 浏览: 235148 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

jpa一对一映射案例

阅读更多

 双向和单向的区别,其实不在数据库,而在加载方向。如Person和IdCard,单向是Person拥有IdCard的实例可以加载IdCard,而双向不但Person可以加载IdCard,IdCard可以拥有Person实例来加载Person。数据库还是原来的数据库(两个共享主键的表)

以下模拟双向一对一得映射案例

表结构如下:

Person表结构

IdCard表结构

 

IDCard类

package com.ljq.entity; 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; import javax.persistence.Table; /** * 身份证 * * @author jiqinlin * */ @Entity @Table(name = "tb_idcard") public class IDCard { @Id @GeneratedValue private Integer id; @Column(nullable = false, length = 18) private String cardno; //unique= true 指明personid列的值不可重复。 //optional = false指明Person不可为空 @OneToOne(cascade = CascadeType.ALL, optional = false) @JoinColumn(name = "personid",referencedColumnName="id", unique = true) private Person person; public IDCard() { super(); } public IDCard(String cardno) { super(); this.cardno = cardno; } public String getCardno() { return cardno; } public void setCardno(String cardno) { this.cardno = cardno; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }

Person类

package com.ljq.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; /** * 人 * * @author jiqinlin * */ @Entity @Table(name = "tb_person") public class Person { @Id @GeneratedValue private Integer id; @Column(nullable = false, length = 20) private String name; //optional = false指明IDCard可为空 //mappedBy="person"指明Person作为双向关系的维护段,负责外键的更新,起主导作用 @OneToOne(optional = true, cascade = CascadeType.ALL, mappedBy="person") private IDCard idcard; public Person() { super(); } public Person(String name) { super(); this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public IDCard getIdcard() { return idcard; } public void setIdcard(IDCard idcard) { this.idcard = idcard; } }

OneToOneTest测试类

package com.ljq.test; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import org.junit.Test; import com.ljq.entity.IDCard; import com.ljq.entity.Person; public class OneToOneTest { /** * 添加人的时候同时添加对应的身份证 */ @Test public void save() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); Person person = new Person(); person.setName("lisi"); IDCard idcard=new IDCard(); idcard.setCardno("350524"); idcard.setPerson(person); person.setIdcard(idcard); em.persist(person); em.getTransaction().commit(); em.close(); factory.close(); } /** * 删除 */ @Test public void delete() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); //删除人同时会自动删除身份证 em.remove(em.getReference(Person.class, 2)); //删除身份证同时删除人 //em.remove(em.getReference(IDCard.class, (Serializable)1)); em.getTransaction().commit(); em.close(); factory.close(); } /** * 更新 */ @SuppressWarnings("unchecked") @Test public void update() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("ljq"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); List<Person> persons=em.createQuery("select o from Person o").getResultList(); for(Person person:persons){ person.setName("wangwu"); IDCard idcard=person.getIdcard(); if(idcard!=null){ idcard.setCardno("abc"); } em.merge(person); } em.getTransaction().commit(); em.close(); factory.close(); } /** * 用来判断映射是否成功 * */ @Test public void test() { Persistence.createEntityManagerFactory("ljq"); } }
分享到:
评论

相关推荐

    springboot jpa的使用案例_02.zip

    JPA支持多种关系映射,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)、多对多(@ManyToMany)。通过这些注解,可以在实体类中定义关系,实现数据库表之间的关联。 **7. 分页与排序** Spring...

    11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护

    一、JPA一对多关系 在数据库中,一对多关系意味着一个实体可以与多个其他实体关联。例如,一个学生可以属于多个班级(多对一),而一个班级可以包含多个学生(一对多)。在JPA中,我们通过在实体类上使用`@...

    JPA多对多Demo

    本示例中的“JPA多对多Demo”是一个具体的实践案例,展示了如何在JPA中实现多对多关联关系,以及对应的增删改查方法。 多对多关联是现实世界中常见的一种关系类型,例如教师和学生之间的关系,一个教师可以教多个...

    基于HibernateJPA最新案例

    首先,Java Persistence API (JPA) 是Java EE平台的一部分,它提供了一种标准的方式来管理和持久化Java应用程序中的对象。JPA通过使用注解或XML配置,使得开发者可以将数据模型与数据库表映射,从而避免了繁琐的手动...

    JPA 标注 JPA标签手册

    - `@OneToOne`:表示一对一关系,每个实例只对应另一个实例。 - `@ManyToMany`:表示多对多关系,一方可以有多个另一方实例,反之亦然。 - `@JoinColumn` 和 `@JoinTable`:定义关联的列或表。 4. **扩展和特殊...

    Spring boot + shiro + jpa小案例

    在这个“Spring boot + shiro + jpa小案例”中,我们将深入探讨这三个框架如何协同工作以实现一个完整的Web应用。 首先,Spring Boot是Spring框架的一个扩展,它简化了Spring应用程序的初始搭建以及开发过程。...

    Pro JPA 2版

    通过阅读本书,读者可以对JPA2的架构有一个清晰的了解。JPA2提供了丰富的特性,可以处理从简单的CRUD操作到复杂的查询和事务管理。书中第一章“Introduction”将为读者提供JPA2的基本概念介绍,帮助初学者快速入门...

    jpa入门案例:单表查询,包括分页查询 使用springboot来整合实现

    Spring Data JPA是Spring对JPA的扩展,提供了更高级的查询支持。 接着,创建一个实体类,例如名为`User`,并使用`@Entity`注解标记该类为数据库表对应的实体。然后,使用`@Id`注解指定主键字段,以及可能的`@Table`...

    JPA学习大全.docx

    在Java开发中,Spring Data JPA是一个强大的工具,它基于ORM(对象关系映射)框架和JPA(Java Persistence API)规范,为开发者提供了一种简化数据库访问和操作的方式。通过使用Spring Data JPA,开发者可以减少大量...

    jpa 全面学习资料

    - **关系映射(Relationship Mapping)**: 包括一对一、一对多、多对一和多对多关系,使用`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`等注解实现。 - **查询语言(JPQL, Java Persistence Query ...

    最好的JPA详解大全

    4. **关系映射**:学习一对一、一对多、多对一、多对多关系的映射,使用`@OneToOne`、`@OneToMany`、`@ManyToOne`、`@ManyToMany`注解,并理解关联的加载方式,如懒加载(Lazy)和急加载(Eager)。 5. **查询语言...

    01_传智播客JPA详解_全面阐释和精彩总结JPA

    3. **实体关系映射(Entity Relationships)**:探讨不同类型的数据库关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),以及如何使用注解进行映射。 4. **持久化管理...

    jpa的工程

    **JPA(Java Persistence API)**是Java...总的来说,JPA作为一个强大的ORM框架,为Java开发者提供了便捷的数据操作方式,降低了与数据库交互的复杂性,而源码分析和实际项目案例则有助于深化对JPA的理解和应用能力。

    JPA2.0高级教程

    - **一对多、多对一映射**:使用`@ManyToOne`、`@OneToMany`等注解表示一对多或多对一的关系。 - **多对多映射**:使用`@ManyToMany`注解表示多对多的关系。 #### 三、高级主题 ##### 3.1 查询语言 - **JPQL**:...

    jpa性能优化ppt

    对于一对一和多对一关系,应仔细考虑应用程序的具体用例。懒加载CLOB和BLOB字段通常是个好主意。使用辅助表可以更好地隔离懒加载的数据,避免加载过多字段(通常表明领域模型存在问题)。对于频繁使用的数据和关系,...

    针对MySQL数据库做的JPA的小例子

    Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象-关系映射(ORM),使得Java开发人员可以使用面向对象的方式来操作数据库。 **JPA核心概念** 1. **实体(Entity)**: JPA中的实体对应于数据库中...

    jpa试用

    - **应用场景**:在这个案例中,JPA被用于实现一个税务登记系统。系统的目标是处理复杂的税务登记流程,涉及到各种实体之间的复杂关系。 - **面临的挑战**: - 实体间的多对多关系。 - 对复杂查询的支持。 - ...

    SUN公司的JPA课件

    - **关系类型**:实体之间可以通过多种方式进行关联,如一对一、一对多、多对多等。 - **映射方式**:实体间的这些关系可以通过`@OneToOne`、`@OneToMany`、`@ManyToMany`等注解进行定义。 #### 六、演示案例 - **...

    全文检索引擎lucene的研究和使用(sping mvc + jpa 编写的案例)

    JPA是Java平台上的一个标准,用于对象关系映射(ORM),使得开发人员可以使用面向对象的编程方式来操作数据库。在这个项目中,JPA可能被用来存储和检索与搜索引擎相关的数据,如索引元数据或用户查询记录。 1. **...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    每个角色都有多个权限(Permission),用户则与角色有一对多的关系。在SpringSecurity的配置中,会定义一个自定义的AuthenticationProvider来处理用户的登录认证,以及UserDetailsService来获取用户信息。此外,还...

Global site tag (gtag.js) - Google Analytics