`
xly_971223
  • 浏览: 1273716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate annotation 一对一关联

    博客分类:
  • java
阅读更多
一对一关联主要有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;
	}
	
	
}
2
1
分享到:
评论

相关推荐

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

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

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

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

    hibernate annotation hibernate3

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

    hibernate annotation 中文文档

    - `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 用于处理各种关联关系,如一对一、一对多、多对一、多对多。 3. **继承与多态** - `@Inheritance`: 定义继承策略,如SINGLE_TABLE(单表)、JOINED...

    最全的Hibernate Annotation API文档

    1. 一对一(OneToOne):使用`@OneToOne`注解表示两个实体之间一对一的关系。 2. 一对多(OneToMany):使用`@OneToMany`注解表示一个实体可以对应多个其他实体。 3. 多对一(ManyToOne):使用`@ManyToOne`注解表示...

    Hibernate Annotation 中文文档

    在这个例子中,`User`类代表了`users`表,`id`是主键,`username`是表的一个列,`role`是与`Role`类的一对多关联。 **4. 注解的优势** - **简洁性**:注解使得ORM配置与实体类代码紧密集成,减少了XML配置文件的...

    Hibernate Annotation库

    例如,`@ManyToOne`表示一对多的关系,`@OneToMany`则表示多对一的关系,它们可以方便地处理复杂的数据库关系。 3. **ejb3-persistence.jar**: 这个jar包是Java EE企业版中的一部分,包含了JSR 303(Java ...

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

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

    Hibernate Annotation入门

    而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...

    Hibernate Annotation 学习笔记

    而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML配置文件的繁琐工作,使得开发过程更加简洁高效。本文将通过一个实际操作的实例,逐步介绍Hibernate Annotation的基础...

    hibernate annotation api chm文件

    - `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 定义不同类型的关联关系,如一对一、一对多、多对一和多对多。 3. **实体类的注解示例** 一个简单的User实体类可能如下所示: ```java @Entity @...

    HibernateAnnotation

    - **`@OneToOne`** 和 **`@JoinColumn`**:用于表示一对一关联关系,并指定外键的名称。 ```java @Entity class MedicalHistory implements Serializable { @Id @OneToOne @JoinColumn(name = "person_id") ...

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

    本篇文章将深入探讨如何使用Hibernate Annotation来实现基于外键的单向多对一关联。 在关系型数据库中,多对一关联是一种常见的关系类型,意味着一个实体(如表)可以与另一个实体有多条记录关联,而另一个实体只能...

    Hibernate distribution and annotation

    6. **@OneToMany, @ManyToOne, @OneToOne, @ManyToMany**: 用于定义关联关系,如一对一、一对多、多对多等。 7. **@Temporal**: 用于日期和时间字段的特殊处理,如TIMESTAMP、DATE或TIME。 8. **@Inheritance**...

    Hibernate_Annotation关联映射

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

    hibernate-Annotation.jar

    - `@OneToOne`:一对一关联,表示两个实体类之间存在一对一的关系。 - `@ManyToOne`:多对一关联,一个实体类的属性对应另一个实体类的多个实例。 - `@OneToMany`:一对多关联,一个实体类的实例对应另一个实体类...

    Hibernate annotation JPA 一对多,多对多

    在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...

    hibernate-annotation

    6. `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`:这些注解用于描述多对一、一对多、一对一和多对多的关联关系。例如,一个用户可以有多个订单: ```java @Entity public class User { @Id private ...

    Hibernate中文文档+hibernate annotation +distribution

    2. 关联映射:通过注解处理一对多、一对一、多对多等复杂关系,简化数据库设计。 3. 动态查询:使用Criteria API或HQL构建动态查询,灵活适应业务需求。 总之,Hibernate中文文档和相关jar包提供了学习和使用...

Global site tag (gtag.js) - Google Analytics