关闭

【SSH进阶之路】【十二】hibernate5 注解映射【5】一对一共享主键关联

标签: hibernatessh
355人阅读 评论(1) 收藏 举报
分类:

一对一共享主键

下面我们直接通过实例来讲解共享主键配置:
主键主控方:Article

package com.chenhao.model;

@Table(name = "t_article2")
@Entity
public class Article {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String title;

    @OneToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY,optional = false)
    @PrimaryKeyJoinColumn//配置共享主键,否则会额外生成外键关联列
    private ArticleContent articleContent;
    //忽略get 和set方法
}

引用主键方:ArticleContent。这是共享主键关联的关键配置地方所在类

package com.chenhao.model;

@Table(name = "t_article_content")
@Entity
public class ArticleContent {
    @Id
    @GenericGenerator(name = "foreignKey" ,//生成器名称
    strategy = "foreign",//使用hibernate的外键策略
    parameters = @Parameter(value = "article",name = "property"))//指定成员属性中的article所在类的主键为本类的主键,这里的参数属性name必须为"property"
    @GeneratedValue(generator = "foreignKey")//使用上述定义的id生成器
    private Integer id;
    @Lob
    private String content;
    //如果试图不加此注解来形成单向关联,会抛出异常,
    //因为设置了共享主键这里是否配置mapperBy放弃维护关联关系已失去作用。
    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn//如果不加此注解,hibernate会在数据库默认生成一条article_id属性
    private Article article;

    //忽略get 和set方法

下面是我们的测试方法:

Article article = new Article();
article.setTitle("title");
ArticleContent articleContent = new ArticleContent();
articleContent.setContent("content");
article.setArticleContent(articleContent);
articleContent.setArticle(article);//必须双方设置
session.save(article);

下面是几点需要注意的:

1.在设置属性ID的时候必须注意字段的长度,如笔者这样使用Oracle的sequence来生成ID,其长度有14位之长,则应选择hibernate类型long,对应的实体中应选择Long,这样不会出现溢出的情况。

2.在测试的时候必须要注意这两张表之间因为已经存在了一对一的关系,所以我们不能只写articleContent.setArticle(article);而忽略了articleContent.setArticle(article);这样在做插入的时候会报出attempted to assign id from null one-to-one property: address的错误.
3.如果不写cascade=”all”或者写成cascade=”none”的话,即使写了article.setArticleContent(articleContent);和articleContent.setArticle(article);也不会发生任何事情,只有user会被存储。
4.one-to-one的效率问题——-one-to-one在查询时,总是查出和主表关联的表,而且one-to-one的lazy属性只有false proxy no-proxy三种,没有true。outer-join=”false”也只是徒增查询语句条数,把本来的一条sql语句变成多条。所以在one-to-one这种一对一的关系不是很强的情况下(one-to-one关系强即总是查出这所有的几个关联表),或者是在一张表中存在多个one-to-one的情况下,使用最好one-to-many来代替one-to-one
1
0
查看评论

hibernate5(13)注解映射[5]一对一共享主键关联

一对一共享主键下面我们直接通过实例来讲解共享主键配置: 主键主控方:Articlepackage com.zeng2.model;@Table(name = "t_article2") @Entity public class Article { @Id @Ge...
  • qwe6112071
  • qwe6112071
  • 2016-04-10 09:09
  • 4565

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

标签: hibernate 主键 关联 映射 存储 级联 one-to-one 分类:hibernate3.3.2  hibernate中一对一的关联有两种方式:一种是采用外键关联,另外一种是采用主键关联。  最近项目中用到一对一主键双向关联,...
  • qishuo_java
  • qishuo_java
  • 2014-03-08 21:24
  • 2218

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。
  • jiuqiyuliang
  • jiuqiyuliang
  • 2014-10-23 08:15
  • 23779

MyBatis:关联查询——一对一查询及一对一共享主键的解决方案

需求:假设丈夫和妻子是一对一关系,我们通过丈夫查询到妻子 创建两个SQL表:husband和wife,我们将外键设在husband里如图: husband wife 注意:一对多、多对一时,我们将外键设在多方,而一对一设在任何一方都可以。 而在实体类里,我们的外键定义和表中定义的一...
  • weixin_41113108
  • weixin_41113108
  • 2018-01-09 17:12
  • 13

新手上路之Hibernate(四):单向一对一关联映射(主键、唯一外键关联)

一、概念 一对一关联映射:        两个对象之间是一对一的关系,例如人和身份证号码之间的关系。 单向一对一关联映射:        即在一个对象中存在另一个对象的引用,而在另一个对象中则不存在该对象的引用。...
  • aboy123
  • aboy123
  • 2013-09-10 19:50
  • 8583

【SSH进阶之路】【十二】hibernate5 注解映射【4】一对一外键关联

在实际博客网站中,文章内容的数据量非常多,它会影响我们检索文章其它数据的时间,如查询发布时间、标题、类别的等。这个时候,我们可以尝试将文章内容存在另一张表中,然后建立起文章——文章内容的一对一映射一对一关联有两种方式,一种是外键关联,另一种是复合主键关联。外键关联下面我们先看一个一对一单向关联的实例...
  • Vchen_hao
  • Vchen_hao
  • 2017-01-12 09:31
  • 516

hibernate能否实现非主键一对一关联

原文链接 import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import ja...
  • a214919447
  • a214919447
  • 2017-04-12 14:12
  • 594

【SSH快速进阶】——Hibernate一对一映射(one-to-one)——主键关联映射

在Hibernate中实现一对一映射,有两种实现方式:1、主键关联;2、唯一外键关联,这里先说一下主键关联映射。   主键关联映射:其中一个表的主键依赖于另一张表的主键而建立起的一对一的关系,这两张互相关联的表的主键一致。   关联映射又可细分为单向关联映射
  • huyuyang6688
  • huyuyang6688
  • 2015-12-10 16:50
  • 2045

【hibernate框架】一对一单向主键关联(Annotation实现)

单项主键关联指的是:husband和wife之间有关联关联的。但是是用主键做关联的,说白了就是husband的id会参考wife的id(husband的id是1,n那么它所对应的wife的id也是1)。 Husband.java: package cn.edu.hpu.one2one; ...
  • u013517797
  • u013517797
  • 2015-02-06 15:33
  • 1253

hibernate5(4)实体映射注解配置[1]注解全面解析

相对于经典风格的实体配置xxx.hbm.xml,新版本hibernate使用JPA(Java Persistence API)注解配置能使我们的开发更加敏捷便利.在本系列前面部分的文章中,我们围绕JPA注解风格配置来逐步深入学习。配置实例下面先看一个实体类的配置实例:package com.zeng...
  • qwe6112071
  • qwe6112071
  • 2016-03-30 12:41
  • 11216
    个人资料
    • 访问:46121次
    • 积分:1097
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:15篇
    • 译文:0篇
    • 评论:8条
    博客专栏
    欢迎打赏
    微信
    欢迎打赏
    支付宝
    最新评论