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

标签:

hibernate

主键

关联

映射

存储

级联

one-to-one

分类:hibernate3.3.2

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

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

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

  husband类: 

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 {
 private int id;
 private String name;
 private Wife wife;
 @Id
 @GeneratedValue//主键生成器

 public int getId(){
  return id;
 }
 public String getName() {
  return name;
 }
 @OneToOne(cascade=CascadeType.ALL)
 @PrimaryKeyJoinColumn//这个注解只能写在主(生成ID)的一端

 public Wife getWife() {
  return wife;
 }
 public void setId(int id) {
  this.id = id;
 }
 public void setName(String name) {
  this.name = name;
 }
 public void setWife(Wife wife) {
  this.wife = wife;
 }
}
  wife类:

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 {
 private int id;
 private String name;
 private Husband husband;
 
 @Id
 @GenericGenerator(name="pkGenerator",strategy="foreign",parameters={@Parameter(name="property",value="husband")})
   @GeneratedValue(generator="pkGenerator")

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

 public Husband getHusband() {
  return husband;
 }
}
  OneToOnePKTest类:

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 {
 private static SessionFactorysessionFactory;
 
 @BeforeClass
 public static void beforeClass() {
   sessionFactory= newAnnotationConfiguration().configure().buildSessionFactory();
 }
 @AfterClass
 public static void afterClass() {
  sessionFactory.close();
 }
 
 @Test
 public void testSave(){
  Session s =sessionFactory.getCurrentSession();
  s.beginTransaction();
  
  Husband h = newHusband();
  Wife w = new Wife();
  w.setName("w");
  h.setName("h");


  h.setWife(w);
  w.setHusband(h);
  s.save(w);
  s.getTransaction().commit();
 }

@Test
 public void testSchemaExport() {
  new SchemaExport(newAnnotationConfiguration().configure()).create(false, true);
 }
 public static void main(String[] args) {
  beforeClass();
  newOneToOnePKTest().testSave();
  afterClass();
 }
}

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值