`
jsjzhou
  • 浏览: 28546 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate annotation 一对一关系共享主键配置

阅读更多

Hibernate annotation 一对一关系共享主键配置

作者 武汉科技大学 周剑华

引言

在这个例子中.分为学生基本信息表(student_basic)和学生详细信息表(student_detail).两个表共享主键.利用hibernate annotation @one2one映射.为了共享主键,需要用到hibernate@PrimaryKeyJoinColumn来完成.

 

数据库schema

    第一.        数据库的关系图

      (该文章书写时在word中完成.但是由于javaeye的编辑目前不支持图片拷贝.暂时无法显示该图片.该图片是一个ER图.描述student_basic和student_detail的关系)

    第二.ddl语句

 

 

 create table student_detail
(
   student_id           int not null,
   home_address         varchar(100),
   home_phome           varchar(13)
);

/*==============================================================*/
/* Table: studnet_basic                                         */
/*==============================================================*/
create table studnet_basic
(
   student_id           int not null,
   studnet_name         varchar(20),
   sex                  varchar(10),
   primary key (student_id)
);

alter table student_detail add constraint FK_R_Student_basic_detail foreign key (student_id)
      references studnet_basic (student_id) on delete restrict on update restrict;

  

 

实体类配置

第一. StudentBasic类配置

package org.jenfer.interview.ch07.entity;

 

import java.io.Serializable;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

 

@Entity(name="StudentBasic")

@Table(name="student_basic")

public class StudentBasic implements Serializable{

         private static final long serialVersionUID = 691350277643811847L;

 

         @Id

         @GeneratedValue(strategy=GenerationType.IDENTITY)

         @Column(name="student_id")

         private Integer studentId;

        

         @Column(length=10)

         private String studentName;

        

         @Column(length=10)

         private String sex;

        

         public StudentBasic() {

         }

 

         public Integer getStudentId() {

                   return studentId;

         }

 

         public void setStudentId(Integer studentId) {

                   this.studentId = studentId;

         }

 

         public String getStudentName() {

                   return studentName;

         }

 

         public void setStudentName(String studentName) {

                   this.studentName = studentName;

         }

 

         public String getSex() {

                   return sex;

         }

 

         public void setSex(String sex) {

                   this.sex = sex;

         }

}

 

第二 . StudentDetail配置

package org.jenfer.interview.ch07.entity;

 

import java.io.Serializable;

 

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToOne;

import javax.persistence.PrimaryKeyJoinColumn;

import javax.persistence.Table;

 

import org.hibernate.annotations.GenericGenerator;

import org.hibernate.annotations.Parameter;

 

@Entity(name="StudentDetail")

@Table(name="student_detail")

public class StudentDetail implements Serializable{

         private static final long serialVersionUID = 2038888147029653370L;

        

         @Id

         @Column(name="student_id")

         @GeneratedValue(generator="foreigner")

         @GenericGenerator(name="foreigner",strategy="foreign",parameters={

                            @Parameter(name = "property",value="studentBasic")

         })

         private Integer stuId;

        

         @OneToOne

         @PrimaryKeyJoinColumn

         private StudentBasic studentBasic;

        

         @Column(length=50)

         private String homeAddress;

        

         @Column(length=100)

         private String homePhomeNumber;

 

         public StudentDetail() {

         }

 

         public StudentBasic getStudentBasic() {

                   return studentBasic;

         }

 

         public void setStudentBasic(StudentBasic studentBasic) {

                   this.studentBasic = studentBasic;

         }

 

         public String getHomeAddress() {

                   return homeAddress;

         }

 

         public void setHomeAddress(String homeAddress) {

                   this.homeAddress = homeAddress;

         }

 

         public String getHomePhomeNumber() {

                   return homePhomeNumber;

         }

 

         public void setHomePhomeNumber(String homePhomeNumber) {

                   this.homePhomeNumber = homePhomeNumber;

         }

 

         public Integer getStuId() {

                   return stuId;

         }

 

         public void setStuId(Integer stuId) {

                   this.stuId = stuId;

         }

}

 

小结

         由于JPA没有定义怎么共享主键的方法.所以必须得借助hibernate的属性来设置.

@Id

         @Column(name="stu_id")

         @GeneratedValue(generator="foreigner")

         @GenericGenerator(name="foreigner",strategy="foreign",parameters={

                            @Parameter(name = "property",value="studentBasic")

         })

语句块中, @Parameter(name = "property", value="studentBasic")属性指出,从类StudentDetail的主键要共享studentBasic属性的主键值.

分享到:
评论
2 楼 hao12345 2011-12-21  
你好,如果从数据库中查询出StudentBasic实例,用setStudentBasic(StudentBasic studentBasic)方法保存,然后save StudentDetail 实例,怎么会报错呢?
1 楼 zhaoyou 2011-03-10  
从表中的这里写错了吧,要对应数据库的字段吧
@Id
@Column(name="stu_id")

相关推荐

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

    本文将详细讲解“Hibernate Annotation 中的共享主键一对一双向关联”。 首先,我们需要理解什么是共享主键(Shared Primary Key)。在一对一的关联关系中,如果两个实体共享同一个主键,那么这种关联被称为共享...

    hibernate annotation hibernate3

    这些注解分别表示一对多、多对一、一对一和多对多的关系。例如,表示用户与角色的一对多关系: ```java @ManyToOne @JoinColumn(name="ROLE_ID") private Role role; ``` 四、继承策略注解 1. `@Inheritance`...

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

    在Java的持久化框架Hibernate中,`@OneToOne`注解用于表示一对一的关联关系,而唯一外键一对一双向关联则是这种关系的一种具体实现方式。这篇文章将深入探讨这一概念,帮助你理解如何在实际开发中应用。 首先,我们...

    hibernate annotation 中文文档

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

    详解Hibernate一对一映射配置

    在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体之间一对一的关系。这种关系通常出现在一个实体的实例只能与另一个实体的单个实例相关联的情况。下面我们将...

    hibernate 中文文档 and _annotation.chm

    Hibernate是一款开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。Hibernate允许开发人员将Java对象模型与数据库表进行映射,从而避免了传统的JDBC代码编写,提高了开发效率。在Hibernate...

    hibernate-annotation 所需要的jar包

    例如,使用@Id注解标记主键字段,@Column注解定义列名和属性,@OneToMany、@ManyToOne、@OneToOne和@ManyToMany用于定义多对一、一对多、一对一和多对多的关联关系。 5. **持久化操作**: Hibernate提供了增删改查...

    Hibernate_Annotation关联映射

    1.共享主键的一对一关联映射: @Entity @Table(name="Test_Body") public class Body { private Integer id; private Heart heart; @Id public Integer getId() { return id; } public void setId(Integer id...

    hibernate_reference-annotation

    - **一对一关联**:使用 @OneToOne 或 @JoinColumn 定义一对一关系。 - **一对多关联**:使用 @OneToMany 或 @JoinColumn 定义一对多关系。 - **多对多关联**:使用 @ManyToMany 定义多对多关系,通常需要通过中间表...

    hibernate3.4的jar包

    4. **关系映射**:@OneToOne、@ManyToOne、@OneToMany和@ManyToMany注解用于处理不同类型的对象间的关系,如一对一、一对多、多对一和多对多关系。 5. **查询语言**:Hibernate支持HQL(Hibernate Query Language)...

    hibernate中的注释的几种配置方式

    - **@OneToMany**:用于配置一对多关联关系。配合`@Cascade`注解可以自动级联执行CRUD操作,如`Cascade.ALL`表示所有CRUD操作都将被级联执行。 示例代码: ```java @OneToMany(targetEntity=Attachment.class) @...

    Hibernate(session管理)

    在Java的持久化框架中,Hibernate是一个非常重要的组件,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的核心概念——Session管理。 首先,...

    hibernate 帮助文档

    11. **一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)关联**:这些是数据库关系映射的关键,Hibernate提供了多种映射方式来处理这些关联。 12. **集合映射**:包括List、Set、Map等类型的...

    hibernate api 中文

    6. @ManyToOne, @OneToOne, @OneToMany, @ManyToMany:定义关联关系,如一对一、一对多、多对一、多对多关系。 7. @JoinColumn:在关联关系中,用于指定外键列的属性。 四、其他重要API 1. Criteria API:提供了...

    Hibernate学习笔记

    一对一映射可以通过在主键上使用unique属性或者使用many-to-one来实现。多对多映射通常通过关联表来实现,但也可以通过集合映射来简化。 集合映射涉及到List、Bag和Map等接口,每种集合类型都有不同的配置需求。...

    java-Hibernate帮助文档

    13. **集合映射**:Hibernate可以方便地处理一对多、多对一、多对多的关系映射,如`@OneToMany`, `@ManyToOne`, `@ManyToMany`等注解。 14. **拦截器(Interceptors)**:通过实现`Interceptor`接口,可以在对象...

    hibernate的注解形式

    **正文** Hibernate是一款强大的Java持久化框架,它简化了数据库操作,使得...在提供的"HibernateAnnotation"压缩包文件中,应该包含了一些具体的注解配置示例,这将帮助你更深入地了解和掌握Hibernate的注解配置。

    Hibernate_学习笔记.

    - **一对一关联映射** - **唯一外键关联-单向**:一个对象有一个唯一的外键指向另一个对象。 - **唯一外键关联-双向**:两个对象互相引用对方。 - **主键关联-单向**:一个对象的主键作为另一个对象的外键。 - *...

    Hibernate src

    9. **关联映射**:包括一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)四种关系映射,使Java对象之间的关系能够准确地反映到数据库表的关联上。 10. **事件监听器**:...

Global site tag (gtag.js) - Google Analytics