`
林里风咏
  • 浏览: 12782 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

JPA实现一对一

    博客分类:
  • JPA
阅读更多
用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();
	}

}

0
0
分享到:
评论

相关推荐

    基于jpa的一对一的主键测试.docx

    本文档介绍了如何使用 Java 持久层 API(JPA)实现一对一的主键测试。该测试涵盖了人员表和身份证表之间的一对一关系,使用了 JPA 的注解来定义实体类和关系。 实体类设计 在该测试中,我们定义了两个实体类:...

    JPA中的一对一双向关联

    理解JPA中一对一双向关联的实现,你可以查看Hibernate(一个流行的JPA实现)的源码,学习其内部如何处理关联的建立和维护。同时,使用诸如IntelliJ IDEA这样的集成开发环境(IDE),其内置的代码生成器可以帮助你...

    JPA一对一关系实例配置

    如果你使用的是Hibernate作为JPA实现,那么这些表结构会由Hibernate自动创建,前提是你的JPA配置允许Hibernate进行自动Schema更新。 在实际项目中,我们还需要配置JPA环境。这通常包括设置数据源、实体扫描路径、...

    JPA 一对一实例配置

    通过以上配置,我们就可以在JPA中实现一对一关联,并进行相应的CRUD操作。在使用过程中,需要注意避免循环引用,因为这可能导致无限递归问题。同时,合理设计实体间的关联关系,可以提高代码的可读性和数据库操作的...

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

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

    jpa实现数据库操作

    - **一对一(OneToOne)**: 一个实体对应另一个实体的唯一实例。 - **一对多(OneToMany)**: 一个实体对应多个实体实例。 - **多对一(ManyToOne)**: 多个实体对应一个实体实例。 - **多对多(ManyToMany)**:...

    JPA一对多和多对一关系

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

    JPA规范实现与总结

    1. **可移植性**:由于JPA是基于标准API构建的,因此可以在不同的JPA实现之间轻松迁移,无需修改业务代码。 2. **简化开发**:通过使用注解,JPA简化了数据库交互代码的编写,开发者可以专注于业务逻辑而非数据访问...

    jpa例子jpajpa

    OpenJPA是JPA的一个开源实现,它提供了完整的JPA功能,包括持久化、查询、事务管理等。你可以通过阅读源代码来深入理解JPA的工作原理,以及OpenJPA是如何实现这些功能的。 学习和掌握JPA对于开发Java企业级应用至关...

    struts + jpa 实现 网络书城

    此外,为了优化用户体验,可能会实现分页显示书籍列表,这可以通过Struts的拦截器或JPA的分页查询功能来实现。还有安全性方面,可能需要对用户输入进行验证和过滤,防止SQL注入等安全问题,这部分可以通过Struts的...

    JPA 实现继承关系

    在Java世界中,Java Persistence API (JPA) 是一种用于管理关系数据库的框架,它提供了对象-关系映射(ORM)的功能,使得开发者可以使用面向对象的方式来操作数据库。本篇文章将深入探讨如何在JPA中实现继承关系,这...

    jpa单表递归树形结构实现

    通过定义自关联的实体类、配置JPA仓库以及编写适当的查询方法,可以轻松地实现对树形数据的CRUD操作。在实际应用中,还需考虑性能优化,如分页加载、懒加载等策略,以避免大量数据导致的效率问题。

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

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

    Hibernate annotation JPA 一对多,多对多

    同时,还需要在`Teacher`类中添加一个`List<Student>`字段,用`@OneToMany`注解来实现一对多关系,形成双向关联。 3. **多对多关系**: 学生和班级的关系可以是多对多,因为一个学生可以属于多个班级,反过来,一...

    JPA常用关系实现例子

    在这个“JPA常用关系实现例子”中,我们将探讨四种主要的关系类型:一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系定义了实体间的关联,有助于在数据库设计中创建...

    JPA (一)

    **Java 持久化 API(JPA)详解(一)** Java 持久化 API(Java Persistence API),简称 JPA,是 Java 平台上的一个标准,用于管理关系数据库中的数据。JPA 提供了一种面向对象的方式来操作数据库,使得开发人员...

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

    本教程“11_传智播客JPA详解_JPA中的一对多延迟加载与关系维护”聚焦于JPA在处理一对多关系时的延迟加载机制以及如何有效地维护这些关系。 一、JPA一对多关系 在数据库中,一对多关系意味着一个实体可以与多个其他...

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

    在JPA中实现一对一双向关联需要在两个实体类中分别定义关系。 首先,我们来看如何在实体类中定义一对一的关联。假设我们有`Employee`和`Department`两个实体,它们之间是一对一的关系。在`Employee`实体中,我们...

    JPA_2_一对多双向关联关系

    在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联关系。 首先,我们需要定义两个实体,一个是"一"的一端,另一个是"多"的一端。假设我们有`Department`(部门)和`Employee`(员工)两个实体。在`...

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

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

Global site tag (gtag.js) - Google Analytics