`

Hibernate对应关系

 
阅读更多

一对一关联主要有3种方式 
1.两主键关联 
2.外键关联 
3.关联表关联 
这三种方式hibernate annitation都提供了支持 
这里重点讲第二种配置 

配置步骤 
一数据库表配置 
表结构见附录 
sns_topic表示一个论坛主题 
sns_topic_views`表示帖子浏览量 
topic.views_id持有topic_views.id,为多对一关联。但我们需要的是一对一关联 
所以需要在views_id上增加唯一性约束 

Java代码  收藏代码
  1. UNIQUE KEY `views_id` (`views_id`),  


ok 数据库端搞定 

二 entity class 配置 
两个entity class : Topic  TopicViews,代码见附录 
Topic.java 

Java代码  收藏代码
  1. @OneToOne(optional = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)  
  2.    @JoinColumn(name = "views_id")   
  3. public TopicViews getTopicViews() {  
  4.     return topicViews;  
  5. }  



TopicViews.java 

Java代码  收藏代码
  1. @OneToOne(mappedBy = "topicViews")  
  2. public Topic getTopic() {  
  3.     return topic;  
  4. }    
  5.   
  6. public void setTopic(Topic topic) {  
  7.     this.topic = topic;  
  8. }  



这就配置完了 

三 总结 
这个例子中的帖子和帖子点击量,前者属于不经常变化的实体类,而后者更新非常频繁 
配置成一对一的目的是为了更有效的利用缓存 
但事实上效果不好 没能达到预期的效果 
每次更新topicviews都需要先外连接()这两张表,虽然关联的效率很高,但相比主键关联还是差些 
主键一对一关联可独立的访问每个表 而不需要任何的关联查询 


附录1 

Java代码  收藏代码
  1. CREATE TABLE `sns_topic` (  
  2.   `id` INTEGER(11) NOT NULL AUTO_INCREMENT,  
  3.   `author_id` INTEGER(11) NOT NULL,  
  4.   `title` VARCHAR(256) COLLATE utf8_general_ci DEFAULT NULL,  
  5.   `content` TEXT COLLATE utf8_general_ci,  
  6.   `create_date` DATETIME DEFAULT NULL,  
  7.   `quan_id` INTEGER(11) DEFAULT NULL,  
  8.   `category_id` INTEGER(11) DEFAULT NULL,  
  9.   `stick` TINYINT(4) DEFAULT NULL,  
  10.   `digest` TINYINT(4) DEFAULT NULL,  
  11.   `locked` TINYINT(4) DEFAULT NULL,  
  12.   `hide` TINYINT(4) DEFAULT NULL,  
  13.   `views_id` INTEGER(11) DEFAULT NULL,  
  14.   `posts` INTEGER(11) DEFAULT NULL,  
  15.   `last_post` DATETIME DEFAULT NULL,  
  16.   `last_poster` VARCHAR(128) COLLATE utf8_general_ci DEFAULT NULL,  
  17.   `highlight` TINYINT(4) DEFAULT NULL,  
  18.   PRIMARY KEY (`id`),  
  19.   UNIQUE KEY `views_id` (`views_id`),  
  20.   KEY `author_id` (`author_id`),  
  21.   KEY `quan_id` (`quan_id`),  
  22.   CONSTRAINT `sns_topic_fk2` FOREIGN KEY (`views_id`) REFERENCES `sns_topic_views` (`id`),  
  23.   CONSTRAINT `sns_topic_fk` FOREIGN KEY (`author_id`) REFERENCES `sns_user` (`id`),  
  24.   CONSTRAINT `sns_topic_fk1` FOREIGN KEY (`quan_id`) REFERENCES `sns_quan` (`id`)  
  25. )ENGINE=InnoDB  
  26. AUTO_INCREMENT=14 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'  
  27. COMMENT='InnoDB free: 11264 kB; (`author_id`) REFER `sns/sns_user`(`i; InnoDB free: 11264';  
  28.    
  29. //`sns_topic_views`表示帖子浏览量  
  30. CREATE TABLE `sns_topic_views` (  
  31.   `id` INTEGER(11) NOT NULL AUTO_INCREMENT,  
  32.   `views` INTEGER(11) DEFAULT NULL,  
  33.   PRIMARY KEY (`id`)  
  34. )ENGINE=InnoDB  
  35. AUTO_INCREMENT=3 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'  
  36. COMMENT='InnoDB free: 11264 kB';  



附录2 

Java代码  收藏代码
  1. package com.justel.sns.domain;  
  2.   
  3. import static javax.persistence.GenerationType.IDENTITY;  
  4.   
  5. import java.util.Date;  
  6. import java.util.HashSet;  
  7. import java.util.Set;  
  8.   
  9. import javax.persistence.CascadeType;  
  10. import javax.persistence.Column;  
  11. import javax.persistence.Entity;  
  12. import javax.persistence.FetchType;  
  13. import javax.persistence.GeneratedValue;  
  14. import javax.persistence.Id;  
  15. import javax.persistence.JoinColumn;  
  16. import javax.persistence.ManyToOne;  
  17. import javax.persistence.OneToMany;  
  18. import javax.persistence.OneToOne;  
  19. import javax.persistence.PrimaryKeyJoinColumn;  
  20. import javax.persistence.Table;  
  21. import javax.persistence.Temporal;  
  22. import javax.persistence.TemporalType;  
  23.   
  24. import org.hibernate.annotations.Cache;  
  25. import org.hibernate.annotations.CacheConcurrencyStrategy;  
  26.   
  27. /** 
  28.  * 主贴 entity. 
  29.  *  
  30.  * @author xuliangyong 
  31.  */  
  32. @Entity  
  33. @Table(name = "sns_topic", catalog = "sns")  
  34. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)  
  35. public class Topic implements java.io.Serializable {  
  36.     private static final long serialVersionUID = -5503914485019914680L;  
  37.     private Integer id;  
  38.     private User snsUser; //作者  
  39.     private Quan snsQuan; //所属圈子  
  40.     private String title;  
  41.     private String content;  
  42.     private Date createDate;  
  43.     private Integer categoryId; //帖子分类  
  44.     private boolean stick;  //置顶  
  45.     private boolean digest; //精华  
  46.     private boolean lock;       //锁定  
  47.     private boolean hide;       //隐藏  
  48.     private Integer posts;  //回复次数  
  49.     private Date lastPost;  //最后回复时间  
  50.     private String lastPoster;  //最后回复用户  
  51.     private boolean highlight;  //高亮显示  
  52.     private Set<Post> snsPosts = new HashSet<Post>(0);  
  53.       
  54.     private TopicViews topicViews; //访问次数  
  55.     // Constructors  
  56.   
  57.     /** default constructor */  
  58.     public Topic() {  
  59.     }  
  60.       
  61.     public Topic(Integer id){  
  62.         this.id = id;  
  63.     }  
  64.       
  65.     /** minimal constructor */  
  66.     public Topic(User snsUser) {  
  67.         this.snsUser = snsUser;  
  68.     }  
  69.   
  70.     /** full constructor */  
  71.     public Topic(User snsUser, Quan snsQuan, String title,  
  72.             String content, Date createDate, Integer categoryId, boolean stick,  
  73.             boolean digest, boolean lock, boolean hide, TopicViews topicViews, Integer posts,  
  74.             Date lastPost, String lastPoster, boolean highlight,  
  75.             Set<Post> snsPosts) {  
  76.         this.snsUser = snsUser;  
  77.         this.snsQuan = snsQuan;  
  78.         this.title = title;  
  79.         this.content = content;  
  80.         this.createDate = createDate;  
  81.         this.categoryId = categoryId;  
  82.         this.stick = stick;  
  83.         this.digest = digest;  
  84.         this.lock = lock;  
  85.         this.hide = hide;  
  86.         this.topicViews = topicViews;  
  87.         this.posts = posts;  
  88.         this.lastPost = lastPost;  
  89.         this.lastPoster = lastPoster;  
  90.         this.highlight = highlight;  
  91.         this.snsPosts = snsPosts;  
  92.     }  
  93.   
  94.     // Property accessors  
  95.     @Id  
  96.     @GeneratedValue(strategy = IDENTITY)  
  97.     @Column(name = "id", unique = true, nullable = false)  
  98.     public Integer getId() {  
  99.         return this.id;  
  100.     }  
  101.   
  102.     public void setId(Integer id) {  
  103.         this.id = id;  
  104.     }  
  105.   
  106.     @ManyToOne(fetch = FetchType.LAZY)  
  107.     @JoinColumn(name = "author_id", nullable = false)  
  108.     public User getSnsUser() {  
  109.         return this.snsUser;  
  110.     }  
  111.   
  112.     public void setSnsUser(User snsUser) {  
  113.         this.snsUser = snsUser;  
  114.     }  
  115.   
  116.     @ManyToOne(fetch = FetchType.LAZY)  
  117.     @JoinColumn(name = "quan_id")  
  118.     public Quan getSnsQuan() {  
  119.         return this.snsQuan;  
  120.     }  
  121.   
  122.     public void setSnsQuan(Quan snsQuan) {  
  123.         this.snsQuan = snsQuan;  
  124.     }  
  125.   
  126.     @Column(name = "title", length = 256)  
  127.     public String getTitle() {  
  128.         return this.title;  
  129.     }  
  130.   
  131.     public void setTitle(String title) {  
  132.         this.title = title;  
  133.     }  
  134.   
  135.     @Column(name = "content", length = 65535)  
  136.     public String getContent() {  
  137.         return this.content;  
  138.     }  
  139.   
  140.     public void setContent(String content) {  
  141.         this.content = content;  
  142.     }  
  143.   
  144.     @Column(name = "create_date", length = 19)  
  145.     public Date getCreateDate() {  
  146.         return this.createDate;  
  147.     }  
  148.   
  149.     public void setCreateDate(Date createDate) {  
  150.         this.createDate = createDate;  
  151.     }  
  152.   
  153.     @Column(name = "category_id")  
  154.     public Integer getCategoryId() {  
  155.         return this.categoryId;  
  156.     }  
  157.   
  158.     public void setCategoryId(Integer categoryId) {  
  159.         this.categoryId = categoryId;  
  160.     }  
  161.   
  162.     @Column(name = "stick")  
  163.     public boolean getStick() {  
  164.         return this.stick;  
  165.     }  
  166.   
  167.     public void setStick(boolean stick) {  
  168.         this.stick = stick;  
  169.     }  
  170.   
  171.     @Column(name = "digest")  
  172.     public boolean getDigest() {  
  173.         return this.digest;  
  174.     }  
  175.   
  176.     public void setDigest(boolean digest) {  
  177.         this.digest = digest;  
  178.     }  
  179.   
  180.     @Column(name = "locked")  
  181.     public boolean getLock() {  
  182.         return this.lock;  
  183.     }  
  184.   
  185.     public void setLock(boolean lock) {  
  186.         this.lock = lock;  
  187.     }  
  188.   
  189.     @Column(name = "hide")  
  190.     public boolean getHide() {  
  191.         return this.hide;  
  192.     }  
  193.   
  194.     public void setHide(boolean hide) {  
  195.         this.hide = hide;  
  196.     }  
  197.   
  198.     @Column(name = "posts")  
  199.     public Integer getPosts() {  
  200.         return this.posts;  
  201.     }  
  202.   
  203.     public void setPosts(Integer posts) {  
  204.         this.posts = posts;  
  205.     }  
  206.   
  207.     @Temporal(TemporalType.DATE)  
  208.     @Column(name = "last_post", length = 19)  
  209.     public Date getLastPost() {  
  210.         return this.lastPost;  
  211.     }  
  212.   
  213.     public void setLastPost(Date lastPost) {  
  214.         this.lastPost = lastPost;  
  215.     }  
  216.   
  217.     @Column(name = "last_poster", length = 128)  
  218.     public String getLastPoster() {  
  219.         return this.lastPoster;  
  220.     }  
  221.   
  222.     public void setLastPoster(String lastPoster) {  
  223.         this.lastPoster = lastPoster;  
  224.     }  
  225.   
  226.     @Column(name = "highlight")  
  227.     public boolean getHighlight() {  
  228.         return this.highlight;  
  229.     }  
  230.   
  231.     public void setHighlight(boolean highlight) {  
  232.         this.highlight = highlight;  
  233.     }  
  234.   
  235.     @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "snsTopic")  
  236.     public Set<Post> getSnsPosts() {  
  237.         return this.snsPosts;  
  238.     }  
  239.   
  240.     public void setSnsPosts(Set<Post> snsPosts) {  
  241.         this.snsPosts = snsPosts;  
  242.     }  
  243.   
  244.     @OneToOne(optional = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)  
  245.     @JoinColumn(name = "views_id")  
  246.     public TopicViews getTopicViews() {  
  247.         return topicViews;  
  248.     }  
  249.   
  250.     public void setTopicViews(TopicViews topicViews) {  
  251.         this.topicViews = topicViews;  
  252.     }  
  253.   
  254. }  
  255.   
  256.   
  257. package com.justel.sns.domain;  
  258.   
  259. import static javax.persistence.GenerationType.IDENTITY;  
  260.   
  261. import java.io.Serializable;  
  262.   
  263. import javax.persistence.Column;  
  264. import javax.persistence.Entity;  
  265. import javax.persistence.GeneratedValue;  
  266. import javax.persistence.Id;  
  267. import javax.persistence.OneToOne;  
  268. import javax.persistence.PrimaryKeyJoinColumn;  
  269. import javax.persistence.Table;  
  270.   
  271. @Entity  
  272. @Table(name = "sns_topic_views", catalog = "sns")  
  273. public class TopicViews implements Serializable {  
  274.     private Integer id;  
  275.     private Topic topic;  
  276.     private Integer views;  
  277.       
  278.     //http://blog.csdn.net/EJB_JPA/archive/2008/05/11/2433301.aspx  
  279.     @OneToOne(mappedBy = "topicViews")  
  280.     public Topic getTopic() {  
  281.         return topic;  
  282.     }    
  283.       
  284.     public void setTopic(Topic topic) {  
  285.         this.topic = topic;  
  286.     }  
  287.       
  288.     public Integer getViews() {  
  289.         return views;  
  290.     }  
  291.       
  292.     public void setViews(Integer views) {  
  293.         this.views = views;  
  294.     }  
  295.   
  296.     @Id    
  297.     @GeneratedValue(strategy = IDENTITY)  
  298.     public Integer getId() {  
  299.         return id;  
  300.     }  
  301.   
  302.     public void setId(Integer topicId) {  
  303.         this.id = topicId;  
  304.     }  
  305.       
  306.       

 

http://xuliangyong.iteye.com/blog/353096

分享到:
评论

相关推荐

    hibernate对应关系详解

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。本文将深入探讨Hibernate中的九种对象关系映射策略,并结合数据库表结构...

    hibernate的对应关系

    在Hibernate框架中,一对一(One-to-One)映射是一种常见的对象关系映射方式,它表示两个实体类之间存在一个唯一的对应关系。例如,一个用户只有一个身份证,或者一辆车只有一个车牌。下面我们将详细讨论如何在...

    hibernate对应关系的配置文件,

    导入直接提示,不怕再为写错而发愁了,主外键关联以做好

    hibernate对应的jar包

    这个"hibernate对应的jar包"很可能包含了Hibernate框架运行所需的库文件。 在Java应用程序中使用Hibernate,通常需要以下核心的jar包: 1. **hibernate-core.jar**:这是Hibernate的核心库,包含了ORM的主要功能,...

    Hibernate对象对应关系总结

    本文主要介绍了对象之间的对应关系,包含对象之间一对一,一对多双向,多对多的关系,另外简单介绍了二级缓存和分页

    Hibernate 配置跟数据库字段的对应关系

    本文将深入探讨如何在Hibernate配置中设置与数据库字段的对应关系,以及相关的Mysql数据库数据类型。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`,在这个文件中,我们定义了数据源、持久化类...

    hibernate中的对象关系模型

    这种关系意味着两个实体之间存在唯一的对应关系,例如一个人可能只有一个护照。在Hibernate中,可以通过`@OneToOne`注解来建立一对一的映射。 4. **一对多(OneToMany)**: 一个实体可以对应多个其他实体,如一...

    Hibernate 关联关系解除

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。本文将深入探讨Hibernate中的关联关系解除,包括一对多、多对一、一对一以及多对多关系的解除,...

    Hibernate关联关系练习【全】

    一对一(OneToOne)关联是当两个实体之间存在唯一对应关系时使用,比如一个用户只能有一个账号。在Hibernate中,这可以通过@OneToOne注解实现,并可以通过optional参数设置是否允许为空。 一对多(OneToMany)关系...

    Hibernate对象关系详解

    **Hibernate对象关系详解** 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,使得开发者可以方便地在Java对象与数据库表之间进行数据操作。本篇将深入探讨Hibernate中的对象关系映射,包括一对一...

    hibernate对象关系映射实例

    “对应关系有一对一,多对一,多对多”则提示我们将深入学习这三种常见的数据库关联关系在Hibernate中的实现方式。 **Hibernate ORM详解** Hibernate是Java平台上的一个开源ORM框架,它通过提供数据持久化服务,...

    hibernate关联关系映射

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者将数据库操作转换为面向对象的方式,从而简化了数据访问层的编程。"hibernate关联关系映射"是Hibernate的核心概念之一,它定义了如何...

    hibernate的关系映射

    **标题:“Hibernate的关系映射”** 在Java编程领域,Hibernate是一个强大的对象关系映射(ORM)框架,它简化了数据库操作,将Java对象与数据库表之间的交互转化为简单的API调用。关系映射是Hibernate的核心特性之...

    Hibernate映射关系配置:XML方式和注解方式

    在Hibernate中,ORM允许开发者用面向对象的方式操作数据库,通过映射Java类到数据库表,对象的属性对应表的字段,对象的关系对应表间的关联。这种映射有两种主要的实现方式:XML配置和注解配置。 **XML方式** 1. *...

    hibernate映射继承关系(每个类都对应一张表)

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...

    Hibernate和java中的对应数据类型

    下面我们将详细探讨Java、Hibernate以及SQL之间的数据类型对应关系。 1. **基本数值类型**: - `byte` 和 `java.lang.Byte` 对应于 SQL 的 `TINYINT` - `short` 和 `java.lang.Short` 对应于 SQL 的 `SMALLINT` ...

    实体类对应关系处理hibernate

    自己根据课本总结的使用hibernate时,实体类间映射文件即*.hbm.xml文件的写法。如果你正在学习hibernate,保证会对你有所帮助。

    Hibernate关系映射

    **标题:“Hibernate关系映射”** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式,极大地简化了数据持久化的复杂性。"多对一"关系映射是Hibernate...

    hibernate映射关系讲解

    这种关系表示两个实体类之间存在唯一对应的关系,例如,一个 `Customer` 类对应一个 `IdCard` 类。在数据库中,通常有一个共享的主键来标识这种关系。 一对一主键关联的映射配置如下: 对于 `Customer` 类,其映射...

    hibernate 映射关系学习入门 多对多实体映射

    在关系数据库中,多对多关系是指两个表之间存在多个对应关系。例如,学生可以选修多门课程,而课程也可以被多名学生选修。在Hibernate中,多对多关系通过中间表(也称为联接表或关联表)来实现,这个表包含来自两个...

Global site tag (gtag.js) - Google Analytics