用JPA实现一对一的关系
1.IDCard.java
package com.cyberwise.jpa.one2one;
import java.io.Serializable;
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;
import javax.persistence.Version;
@Entity
@Table(name = "idcard_one2one")
public class IDCard implements Serializable{
private Long version;
private Integer id;
private String cardNo;
private Person_One2One person;
public IDCard(){
}
public IDCard(String cardNo){
this.cardNo = cardNo;
}
@Version
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 18, nullable = false,unique=true)
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
/*
* 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。
*/
@OneToOne(mappedBy = "idcard", cascade = { CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REFRESH })
public Person_One2One getPerson() {
return person;
}
public void setPerson(Person_One2One person) {
this.person = person;
}
}
2.Person_One2One.java
package com.cyberwise.jpa.one2one;
import java.io.Serializable;
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;
import javax.persistence.Version;
@Entity
@Table(name="person_one2one")
public class Person_One2One implements Serializable{
private Long version;
private Integer id;
private String name;
private IDCard idcard;
public Person_One2One(){
}
@Version
public Long getVersion() {
return version;
}
public void setVersion(Long version) {
this.version = version;
}
@Id
@GeneratedValue
//采用数据库Id自动增长的方式来生成主键
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="p_name",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;
}
}
3.OneToOneTest.java 测试类
package com.cyberwise.jpa.one2one;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.jboss.seam.annotations.In;
import com.cyberwise.jpa.person.Person;
public class OneToOneTest {
@In
EntityManagerFactory factory;
@In
EntityManager manager;
public void save(){
factory = Persistence.createEntityManagerFactory("test");
manager = factory.createEntityManager();
manager.getTransaction().begin();
Person_One2One p = new Person_One2One();
p.setName("阿奴");//Person是关系维护端
p.setIdcard(new IDCard("100003"));//通过Person把idCard放进去,这关系就由Person来维护
manager.persist(p);
manager.getTransaction().commit();
manager.close();
factory.close();
}
public void update(){
factory = Persistence.createEntityManagerFactory("test");
manager = factory.createEntityManager();
manager.getTransaction().begin();
String sql = "update IDCard i set i.cardNo=:cardNo where i.id=:id";
Query query = manager.createQuery(sql);
query.setParameter("cardNo", "100005");
query.setParameter("id", 7);
query.executeUpdate();
manager.getTransaction().commit();
manager.close();
factory.close();
}
public static void main(String[] args) {
OneToOneTest test = new OneToOneTest();
// test.save();
test.update();
}
}
分享到:
相关推荐
本文档介绍了如何使用 Java 持久层 API(JPA)实现一对一的主键测试。该测试涵盖了人员表和身份证表之间的一对一关系,使用了 JPA 的注解来定义实体类和关系。 实体类设计 在该测试中,我们定义了两个实体类:...
理解JPA中一对一双向关联的实现,你可以查看Hibernate(一个流行的JPA实现)的源码,学习其内部如何处理关联的建立和维护。同时,使用诸如IntelliJ IDEA这样的集成开发环境(IDE),其内置的代码生成器可以帮助你...
如果你使用的是Hibernate作为JPA实现,那么这些表结构会由Hibernate自动创建,前提是你的JPA配置允许Hibernate进行自动Schema更新。 在实际项目中,我们还需要配置JPA环境。这通常包括设置数据源、实体扫描路径、...
通过以上配置,我们就可以在JPA中实现一对一关联,并进行相应的CRUD操作。在使用过程中,需要注意避免循环引用,因为这可能导致无限递归问题。同时,合理设计实体间的关联关系,可以提高代码的可读性和数据库操作的...
- **一对一(OneToOne)**: 一个实体对应另一个实体的唯一实例。 - **一对多(OneToMany)**: 一个实体对应多个实体实例。 - **多对一(ManyToOne)**: 多个实体对应一个实体实例。 - **多对多(ManyToMany)**:...
本篇将深入探讨JPA中的一对一(OneToOne)、一对多(OneToMany)以及多对多(ManyToMany)关系映射。 ### 1. JPA 一对一(OneToOne)关系映射 **概念**:一对一关系意味着两个实体之间存在唯一的关联,一个实体...
**JPA一对多和多对一关系详解** Java Persistence API(JPA)是Java平台上的一个标准,用于处理对象关系映射(ORM),使得开发者可以使用面向对象的方式来操作数据库。在JPA中,实体间的关系映射是核心概念之一,...
OpenJPA是JPA的一个开源实现,它提供了完整的JPA功能,包括持久化、查询、事务管理等。你可以通过阅读源代码来深入理解JPA的工作原理,以及OpenJPA是如何实现这些功能的。 学习和掌握JPA对于开发Java企业级应用至关...
此外,为了优化用户体验,可能会实现分页显示书籍列表,这可以通过Struts的拦截器或JPA的分页查询功能来实现。还有安全性方面,可能需要对用户输入进行验证和过滤,防止SQL注入等安全问题,这部分可以通过Struts的...
在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它提供了对象-关系映射(ORM)的功能,使得开发者可以使用面向对象的方式来操作数据库。本篇文章将深入探讨如何在JPA中实现继承关系,这...
每个角色都有多个权限(Permission),用户则与角色有一对多的关系。在SpringSecurity的配置中,会定义一个自定义的AuthenticationProvider来处理用户的登录认证,以及UserDetailsService来获取用户信息。此外,还...
同时,还需要在`Teacher`类中添加一个`List<Student>`字段,用`@OneToMany`注解来实现一对多关系,形成双向关联。 3. **多对多关系**: 学生和班级的关系可以是多对多,因为一个学生可以属于多个班级,反过来,一...
在这个“JPA常用关系实现例子”中,我们将探讨四种主要的关系类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系定义了实体间的关联,有助于在数据库设计中创建...
通过定义自关联的实体类、配置JPA仓库以及编写适当的查询方法,可以轻松地实现对树形数据的CRUD操作。在实际应用中,还需考虑性能优化,如分页加载、懒加载等策略,以避免大量数据导致的效率问题。
**Java 持久化 API(JPA)详解(一)** Java 持久化 API(Java Persistence API),简称 JPA,是 Java 平台上的一个标准,用于管理关系数据库中的数据。JPA 提供了一种面向对象的方式来操作数据库,使得开发人员...
本教程“11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护”聚焦于JPA在处理一对多关系时的延迟加载机制以及如何有效地维护这些关系。 一、JPA一对多关系 在数据库中,一对多关系意味着一个实体可以与多个其他...
在JPA中实现一对一双向关联需要在两个实体类中分别定义关系。 首先,我们来看如何在实体类中定义一对一的关联。假设我们有`Employee`和`Department`两个实体,它们之间是一对一的关系。在`Employee`实体中,我们...
在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联关系。 首先,我们需要定义两个实体,一个是"一"的一端,另一个是"多"的一端。假设我们有`Department`(部门)和`Employee`(员工)两个实体。在`...
4. **注解细节**:`@JoinColumn`用于单向一对一或一对多关系,而在多对多关系中,通常使用`@JoinTable`来指定中间表的信息,包括表名、连接列等。 5. **操作关联**:在JPA中,可以通过添加或移除对象到集合属性来...