一对一关联主要有3种方式
1.两主键关联
2.外键关联
3.关联表关联
这三种方式hibernate annitation都提供了支持
这里重点讲第二种配置
配置步骤
一数据库表配置
表结构见附录
sns_topic表示一个论坛主题
sns_topic_views`表示帖子浏览量
topic.views_id持有topic_views.id,为多对一关联。但我们需要的是一对一关联
所以需要在views_id上增加唯一性约束
- UNIQUE KEY `views_id` (`views_id`),
ok 数据库端搞定
二 entity class 配置
两个entity class : Topic TopicViews,代码见附录
Topic.java
- @OneToOne(optional = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- @JoinColumn(name = "views_id")
- public TopicViews getTopicViews() {
- return topicViews;
- }
TopicViews.java
- @OneToOne(mappedBy = "topicViews")
- public Topic getTopic() {
- return topic;
- }
- public void setTopic(Topic topic) {
- this.topic = topic;
- }
这就配置完了
三 总结
这个例子中的帖子和帖子点击量,前者属于不经常变化的实体类,而后者更新非常频繁
配置成一对一的目的是为了更有效的利用缓存
但事实上效果不好 没能达到预期的效果
每次更新topicviews都需要先外连接()这两张表,虽然关联的效率很高,但相比主键关联还是差些
主键一对一关联可独立的访问每个表 而不需要任何的关联查询
附录1
- CREATE TABLE `sns_topic` (
- `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
- `author_id` INTEGER(11) NOT NULL,
- `title` VARCHAR(256) COLLATE utf8_general_ci DEFAULT NULL,
- `content` TEXT COLLATE utf8_general_ci,
- `create_date` DATETIME DEFAULT NULL,
- `quan_id` INTEGER(11) DEFAULT NULL,
- `category_id` INTEGER(11) DEFAULT NULL,
- `stick` TINYINT(4) DEFAULT NULL,
- `digest` TINYINT(4) DEFAULT NULL,
- `locked` TINYINT(4) DEFAULT NULL,
- `hide` TINYINT(4) DEFAULT NULL,
- `views_id` INTEGER(11) DEFAULT NULL,
- `posts` INTEGER(11) DEFAULT NULL,
- `last_post` DATETIME DEFAULT NULL,
- `last_poster` VARCHAR(128) COLLATE utf8_general_ci DEFAULT NULL,
- `highlight` TINYINT(4) DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `views_id` (`views_id`),
- KEY `author_id` (`author_id`),
- KEY `quan_id` (`quan_id`),
- CONSTRAINT `sns_topic_fk2` FOREIGN KEY (`views_id`) REFERENCES `sns_topic_views` (`id`),
- CONSTRAINT `sns_topic_fk` FOREIGN KEY (`author_id`) REFERENCES `sns_user` (`id`),
- CONSTRAINT `sns_topic_fk1` FOREIGN KEY (`quan_id`) REFERENCES `sns_quan` (`id`)
- )ENGINE=InnoDB
- AUTO_INCREMENT=14 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
- COMMENT='InnoDB free: 11264 kB; (`author_id`) REFER `sns/sns_user`(`i; InnoDB free: 11264';
- //`sns_topic_views`表示帖子浏览量
- CREATE TABLE `sns_topic_views` (
- `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
- `views` INTEGER(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- )ENGINE=InnoDB
- AUTO_INCREMENT=3 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'
- COMMENT='InnoDB free: 11264 kB';
附录2
- package com.justel.sns.domain;
- import static javax.persistence.GenerationType.IDENTITY;
- import java.util.Date;
- import java.util.HashSet;
- import java.util.Set;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.GeneratedValue;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.ManyToOne;
- import javax.persistence.OneToMany;
- import javax.persistence.OneToOne;
- import javax.persistence.PrimaryKeyJoinColumn;
- import javax.persistence.Table;
- import javax.persistence.Temporal;
- import javax.persistence.TemporalType;
- import org.hibernate.annotations.Cache;
- import org.hibernate.annotations.CacheConcurrencyStrategy;
- /**
- * 主贴 entity.
- *
- * @author xuliangyong
- */
- @Entity
- @Table(name = "sns_topic", catalog = "sns")
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
- public class Topic implements java.io.Serializable {
- private static final long serialVersionUID = -5503914485019914680L;
- private Integer id;
- private User snsUser; //作者
- private Quan snsQuan; //所属圈子
- private String title;
- private String content;
- private Date createDate;
- private Integer categoryId; //帖子分类
- private boolean stick; //置顶
- private boolean digest; //精华
- private boolean lock; //锁定
- private boolean hide; //隐藏
- private Integer posts; //回复次数
- private Date lastPost; //最后回复时间
- private String lastPoster; //最后回复用户
- private boolean highlight; //高亮显示
- private Set<Post> snsPosts = new HashSet<Post>(0);
- private TopicViews topicViews; //访问次数
- // Constructors
- /** default constructor */
- public Topic() {
- }
- public Topic(Integer id){
- this.id = id;
- }
- /** minimal constructor */
- public Topic(User snsUser) {
- this.snsUser = snsUser;
- }
- /** full constructor */
- public Topic(User snsUser, Quan snsQuan, String title,
- String content, Date createDate, Integer categoryId, boolean stick,
- boolean digest, boolean lock, boolean hide, TopicViews topicViews, Integer posts,
- Date lastPost, String lastPoster, boolean highlight,
- Set<Post> snsPosts) {
- this.snsUser = snsUser;
- this.snsQuan = snsQuan;
- this.title = title;
- this.content = content;
- this.createDate = createDate;
- this.categoryId = categoryId;
- this.stick = stick;
- this.digest = digest;
- this.lock = lock;
- this.hide = hide;
- this.topicViews = topicViews;
- this.posts = posts;
- this.lastPost = lastPost;
- this.lastPoster = lastPoster;
- this.highlight = highlight;
- this.snsPosts = snsPosts;
- }
- // Property accessors
- @Id
- @GeneratedValue(strategy = IDENTITY)
- @Column(name = "id", unique = true, nullable = false)
- public Integer getId() {
- return this.id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "author_id", nullable = false)
- public User getSnsUser() {
- return this.snsUser;
- }
- public void setSnsUser(User snsUser) {
- this.snsUser = snsUser;
- }
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "quan_id")
- public Quan getSnsQuan() {
- return this.snsQuan;
- }
- public void setSnsQuan(Quan snsQuan) {
- this.snsQuan = snsQuan;
- }
- @Column(name = "title", length = 256)
- public String getTitle() {
- return this.title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- @Column(name = "content", length = 65535)
- public String getContent() {
- return this.content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- @Column(name = "create_date", length = 19)
- public Date getCreateDate() {
- return this.createDate;
- }
- public void setCreateDate(Date createDate) {
- this.createDate = createDate;
- }
- @Column(name = "category_id")
- public Integer getCategoryId() {
- return this.categoryId;
- }
- public void setCategoryId(Integer categoryId) {
- this.categoryId = categoryId;
- }
- @Column(name = "stick")
- public boolean getStick() {
- return this.stick;
- }
- public void setStick(boolean stick) {
- this.stick = stick;
- }
- @Column(name = "digest")
- public boolean getDigest() {
- return this.digest;
- }
- public void setDigest(boolean digest) {
- this.digest = digest;
- }
- @Column(name = "locked")
- public boolean getLock() {
- return this.lock;
- }
- public void setLock(boolean lock) {
- this.lock = lock;
- }
- @Column(name = "hide")
- public boolean getHide() {
- return this.hide;
- }
- public void setHide(boolean hide) {
- this.hide = hide;
- }
- @Column(name = "posts")
- public Integer getPosts() {
- return this.posts;
- }
- public void setPosts(Integer posts) {
- this.posts = posts;
- }
- @Temporal(TemporalType.DATE)
- @Column(name = "last_post", length = 19)
- public Date getLastPost() {
- return this.lastPost;
- }
- public void setLastPost(Date lastPost) {
- this.lastPost = lastPost;
- }
- @Column(name = "last_poster", length = 128)
- public String getLastPoster() {
- return this.lastPoster;
- }
- public void setLastPoster(String lastPoster) {
- this.lastPoster = lastPoster;
- }
- @Column(name = "highlight")
- public boolean getHighlight() {
- return this.highlight;
- }
- public void setHighlight(boolean highlight) {
- this.highlight = highlight;
- }
- @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "snsTopic")
- public Set<Post> getSnsPosts() {
- return this.snsPosts;
- }
- public void setSnsPosts(Set<Post> snsPosts) {
- this.snsPosts = snsPosts;
- }
- @OneToOne(optional = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- @JoinColumn(name = "views_id")
- public TopicViews getTopicViews() {
- return topicViews;
- }
- public void setTopicViews(TopicViews topicViews) {
- this.topicViews = topicViews;
- }
- }
- package com.justel.sns.domain;
- import static javax.persistence.GenerationType.IDENTITY;
- 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;
- @Entity
- @Table(name = "sns_topic_views", catalog = "sns")
- public class TopicViews implements Serializable {
- private Integer id;
- private Topic topic;
- private Integer views;
- //http://blog.csdn.net/EJB_JPA/archive/2008/05/11/2433301.aspx
- @OneToOne(mappedBy = "topicViews")
- public Topic getTopic() {
- return topic;
- }
- public void setTopic(Topic topic) {
- this.topic = topic;
- }
- public Integer getViews() {
- return views;
- }
- public void setViews(Integer views) {
- this.views = views;
- }
- @Id
- @GeneratedValue(strategy = IDENTITY)
- public Integer getId() {
- return id;
- }
- public void setId(Integer topicId) {
- this.id = topicId;
- }
- }
相关推荐
在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨Hibernate中的九种对象关系映射策略,并结合数据库表结构...
在Hibernate框架中,一对一(One-to-One)映射是一种常见的对象关系映射方式,它表示两个实体类之间存在一个唯一的对应关系。例如,一个用户只有一个身份证,或者一辆车只有一个车牌。下面我们将详细讨论如何在...
导入直接提示,不怕再为写错而发愁了,主外键关联以做好
这个"hibernate对应的jar包"很可能包含了Hibernate框架运行所需的库文件。 在Java应用程序中使用Hibernate,通常需要以下核心的jar包: 1. **hibernate-core.jar**:这是Hibernate的核心库,包含了ORM的主要功能,...
本文主要介绍了对象之间的对应关系,包含对象之间一对一,一对多双向,多对多的关系,另外简单介绍了二级缓存和分页
本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及相关的Mysql数据库数据类型。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`,在这个文件中,我们定义了数据源、持久化类...
这种关系意味着两个实体之间存在唯一的对应关系,例如一个人可能只有一个护照。在Hibernate中,可以通过`@OneToOne`注解来建立一对一的映射。 4. **一对多(OneToMany)**: 一个实体可以对应多个其他实体,如一...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。本文将深入探讨Hibernate中的关联关系解除,包括一对多、多对一、一对一以及多对多关系的解除,...
一对一(OneToOne)关联是当两个实体之间存在唯一对应关系时使用,比如一个用户只能有一个账号。在Hibernate中,这可以通过@OneToOne注解实现,并可以通过optional参数设置是否允许为空。 一对多(OneToMany)关系...
**Hibernate对象关系详解** 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,使得开发者可以方便地在Java对象与数据库表之间进行数据操作。本篇将深入探讨Hibernate中的对象关系映射,包括一对一...
“对应关系有一对一,多对一,多对多”则提示我们将深入学习这三种常见的数据库关联关系在Hibernate中的实现方式。 **Hibernate ORM详解** Hibernate是Java平台上的一个开源ORM框架,它通过提供数据持久化服务,...
在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问层的编程。"hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何...
**标题:“Hibernate的关系映射”** 在Java编程领域,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的交互转化为简单的API调用。关系映射是Hibernate的核心特性之...
在Hibernate中,ORM允许开发者用面向对象的方式操作数据库,通过映射Java类到数据库表,对象的属性对应表的字段,对象的关系对应表间的关联。这种映射有两种主要的实现方式:XML配置和注解配置。 **XML方式** 1. *...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...
下面我们将详细探讨Java、Hibernate以及SQL之间的数据类型对应关系。 1. **基本数值类型**: - `byte` 和 `java.lang.Byte` 对应于 SQL 的 `TINYINT` - `short` 和 `java.lang.Short` 对应于 SQL 的 `SMALLINT` ...
自己根据课本总结的使用hibernate时,实体类间映射文件即*.hbm.xml文件的写法。如果你正在学习hibernate,保证会对你有所帮助。
**标题:“Hibernate关系映射”** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式,极大地简化了数据持久化的复杂性。"多对一"关系映射是Hibernate...
这种关系表示两个实体类之间存在唯一对应的关系,例如,一个 `Customer` 类对应一个 `IdCard` 类。在数据库中,通常有一个共享的主键来标识这种关系。 一对一主键关联的映射配置如下: 对于 `Customer` 类,其映射...
在关系数据库中,多对多关系是指两个表之间存在多个对应关系。例如,学生可以选修多门课程,而课程也可以被多名学生选修。在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,这个表包含来自两个...