`
二当家的
  • 浏览: 25686 次
文章分类
社区版块
存档分类
最新评论

Hibernate一对一主键关联(基于annotation注解方式)

 
阅读更多

hibernate中一对一的关联有两种方式:一种是采用外键关联,另外一种是采用主键关联。

<wbr>最近项目中用到一对一主键双向关联,并且是基于注解的方式。期间遇到一些问题,现在贴出来探讨探讨。</wbr>

<wbr>一个丈夫(husband)对应一个妻子(wife),主要目标是在存储丈夫或者妻子时,关联的对象也被存储。具体代码如下:</wbr>

<wbr><em><strong><span style="color:#1206FF; word-wrap:normal; word-break:normal">husband类:</span></strong></em><wbr></wbr></wbr>

package cn.edu.dlnu.resources.model.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
public class Husband {
<wbr>private int id;<br><wbr>private String name;<br><wbr>private Wife wife;<br><wbr><span style="color:#FE0B39; word-wrap:normal; word-break:normal"><strong>@Id<br><wbr>@GeneratedValue //主键生成器</wbr></strong><br></span><wbr>public int getId() {<br><wbr><wbr>return id;<br><wbr>}<br><wbr>public String getName() {<br><wbr><wbr>return name;<br><wbr>}<br><span style="color:#FE0B39; word-wrap:normal; word-break:normal"><wbr></wbr></span><span style="color:#FE0B39; word-wrap:normal; word-break:normal"><strong>@OneToOne(cascade=CascadeType.ALL)<br><wbr>@PrimaryKeyJoinColumn//这个注解只能写在主(生成ID)的一端</wbr></strong><br></span><wbr>public Wife getWife() {<br><wbr><wbr>return wife;<br><wbr>}<br><wbr>public void setId(int id) {<br><wbr><wbr>this.id = id;<br><wbr>}<br><wbr>public void setName(String name) {<br><wbr><wbr>this.name = name;<br><wbr>}<br><wbr>public void setWife(Wife wife) {<br><wbr><wbr>this.wife = wife;<br><wbr>}<br> }<br><wbr><strong><em><span style="color:#1206FF; word-wrap:normal; word-break:normal">wife类:</span></em></strong></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

package cn.edu.dlnu.resources.model.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

@Entity
public class Wife {
<wbr>private int id;<br><wbr>private String name;<br><wbr>private Husband husband;<br><wbr><br><strong><span style="color:#FE0D3A; word-wrap:normal; word-break:normal"><wbr>@Id<br><wbr>@GenericGenerator(name ="pkGenerator",strategy="foreign" ,parameters={@Parameter(name="property",value="husband")})<br><wbr><wbr><wbr>@GeneratedValue(generator="pkGenerator")</wbr></wbr></wbr></wbr></wbr></span></strong></wbr></wbr></wbr></wbr>

//wife的ID是根据husband的ID来赋值的,这里需要设置ID生成器的策略为foreign,参数中指定wife的ID是使用husband对象中的ID
<wbr>public int getId() {<br><wbr><wbr>return id;<br><wbr>}<br><wbr>public void setId(int id) {<br><wbr><wbr>this.id = id;<br><wbr>}<br><wbr>public String getName() {<br><wbr><wbr>return name;<br><wbr>}<br><wbr>public void setName(String name) {<br><wbr><wbr>this.name = name;<br><wbr>}<br><wbr>public void setHusband(Husband husband) {<br><wbr><wbr>this.husband = husband;<br><wbr>}<br><wbr>@OneToOne(cascade=CascadeType.ALL, mappedBy="wife")</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>public Husband getHusband() {<br><wbr><wbr>return husband;<br><wbr>}<br> }<br><wbr><span style="color:#1206FF; word-wrap:normal; word-break:normal"><em><strong>OneToOnePKTest类:</strong></em></span></wbr></wbr></wbr></wbr></wbr>

package cn.edu.dlnu.resources.model.entity;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import cn.edu.dlnu.resources.model.entity.Husband;
import cn.edu.dlnu.resources.model.entity.Wife;

public class OneToOnePKTest {
<wbr>private static SessionFactory sessionFactory;<br><wbr><br><wbr>@BeforeClass<br><wbr>public static void beforeClass() {<br><wbr><wbr><wbr>sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();<br><wbr>}<br><wbr>@AfterClass<br><wbr>public static void afterClass() {<br><wbr><wbr>sessionFactory.close();<br><wbr>}<br><wbr><br><wbr>@Test<br><wbr>public void testSave(){<br><wbr><wbr>Session s = sessionFactory.getCurrentSession();<br><wbr><wbr>s.beginTransaction();<br><wbr><wbr><br><wbr><wbr>Husband h = new Husband();<br><wbr><wbr>Wife w = new Wife();<br><wbr><wbr>w.setName("w");<br><wbr><wbr>h.setName("h");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>


<wbr><strong><span style="color:#FE1439; word-wrap:normal; word-break:normal"><wbr>h.setWife(w);<br><wbr><wbr>w.setHusband(h);<br></wbr></wbr></wbr></span></strong><wbr><wbr>s.save(w);<br><wbr><wbr>s.getTransaction().commit();<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr>

@Test
<wbr>public void testSchemaExport() {<br><wbr><wbr>new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);<br><wbr>}<br><wbr>public static void main(String[] args) {<br><wbr><wbr>beforeClass();<br><wbr><wbr>new OneToOnePKTest().testSave();<br><wbr><wbr>afterClass();<br><wbr>}<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

hibernate生成的数据库表:create table Husband (
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>id integer not null auto_increment,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>name varchar(255),<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>primary key (id)<br><wbr><wbr><wbr>);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

create table Wife (
<wbr><wbr><wbr><wbr><wbr><wbr><wbr>id integer not null,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>name varchar(255),<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>primary key (id)<br><wbr><wbr><wbr>)<br> 运行testSave(),方法后数据库中husband 与 wife表中记录的主键一致。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

转自:点击打开链接

分享到:
评论

相关推荐

    Hibernate Annotation 共享主键一对一双向关联

    在一对一的关联关系中,如果两个实体共享同一个主键,那么这种关联被称为共享主键的一对一关联。这意味着这两个实体的表在数据库中通过主键进行连接,一个实体的主键同时也作为另一个实体的外键。 在Hibernate中,...

    Hibernate一对一单向外键关联 (联合主键annotation)

    在Hibernate中,一对一关联可以通过`@OneToOne`注解来实现。这个注解可以放在属性上,表示该属性对应另一个实体的实例。外键通常设置在关系的“从属”一方,也就是依赖于其他实体的一方。 对于联合主键,我们需要...

    Hibernate一对一双向外键关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对一双向外键关联是一种常见的关系映射方式,用于表示两个实体类之间一对一的关联关系。在这个场景下,每个实体都有一个引用指向另一个实体,形成双向关联。本篇文章将深入探讨...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和XML的方式。 1. **一对多关联**(Many-to-One) - 在这种关系中,一个实体可以对应多个其他实体。例如,一个班级可以有多个...

    hibernate _annotation 注解编程

    ### Hibernate Annotation注解编程知识点详解 #### 一、概述与设置环境 - **概述**:Hibernate 是一个流行的 Java 持久层框架,它提供了一种面向对象的方式来处理数据库操作。Hibernate 支持多种元数据定义方式,...

    Hibernate Annotation 唯一外键一对一双向关联

    唯一外键是指在一对一关联中,一方的主键同时也作为另一方的外键,确保两个实体共享同一个ID。这可以通过在没有`@JoinColumn`的情况下让两个实体共享相同的主键生成策略来实现。例如,使用`GenerationType.IDENTITY`...

    Hibernate多对多单向关联(annotation/xml)

    本篇将详细讲解如何使用Hibernate实现多对多单向关联,包括注解(Annotation)和XML配置方式。 一、多对多关联的基本概念 多对多关联意味着一个实体可以与多个其他实体关联,反之亦然。例如,学生和课程的关系,一...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    Hibernate一对多、一对一、多对多映射之Annotation篇.doc

    在Java持久化框架Hibernate中,Annotation注解是用于声明对象关系映射(ORM)的一种方式,它使得开发者能够在类和类的属性上直接定义数据库表和列的映射规则。本文主要探讨了使用Hibernate Annotation实现的一对多、...

    hibernate-Annotation.jar

    在Hibernate 3.x版本中,引入了Annotation注解,这是一种元数据的方式,可以替代XML配置文件来描述对象与数据库表之间的映射关系。 **Hibernate Annotation注解** 在Hibernate 3.x之前,对象到数据库的映射通常...

    hibernate annotation hibernate3

    Hibernate 3是Hibernate ORM框架的一个重要版本,它引入了许多新特性,如对JPA(Java Persistence API)的支持,以及对注解的广泛使用。这一版本的更新使得Hibernate更加易于使用,同时也提高了代码的可读性和可维护...

    Spring_Hibernate_JAVAX_Annotation注解

    ### Spring_Hibernate_JAVAX_Annotation 注解详解 #### 一、概述 本文将详细介绍与SSH(Spring+Struts+Hibernate)开发相关的注解。这些注解覆盖了多个领域,如AspectJ、Batch处理、Spring框架本身的功能(包括...

    Hibernate distribution and annotation

    标题“Hibernate distribution and annotation”涉及到的是Hibernate ORM框架的一个特定版本及其相关的注解功能。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程模型来操作...

    Hibernate_Annotation关联映射

    使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3)...

    Hibernate Annotation 笔记 总结 注解

    Hibernate Annotation是Hibernate框架的一个重要特性,它允许开发者直接在Java类上使用注解来定义对象的数据库映射,从而避免了传统的XML配置文件。这种做法提高了代码的可读性和维护性,同时也使得开发流程更为简洁...

    详解Hibernate一对一映射配置

    这里,Person和Address类共享同一主键`PERSON_ID`,表明它们一对一关联。 2. **单方外键关联(Unidirectional Foreign Key Join)** 在单方外键关联中,一个实体通过外键字段引用另一个实体。配置如下: ```xml ...

    最全的Hibernate Annotation API文档

    在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...

    hibernate annotation 中文文档

    - **2.2.5.1 一对一(One-to-one)**:使用 `@OneToOne` 注解来定义两个实体Bean之间的一对一关联关系。 - **2.2.5.2 多对一(Many-to-one)**:使用 `@ManyToOne` 注解来定义多对一的关联关系。 - **2.2.5.3 ...

    ssh2 Annotation注解 框架+oracle

    在"ssh2 Annotation注解 框架+oracle"的场景下,我们将深入探讨SSH2框架如何结合注解和Oracle数据库进行应用开发。 **Spring Annotation注解** Spring框架允许开发者使用注解来声明Bean、依赖注入、事务管理等。...

Global site tag (gtag.js) - Google Analytics