讨论一下Hibernate中对象的一对多或多对一关联关系。这里以日志与日志评论来说明这样的关系,一个日志可以有多条评论,而一条评论则只能对应一个日志。
说明一对多的双向关联。它的现实意义就是从日志的角度可以得到该日志下的多条评论,而从评论的角度则可以知道它属于某个日志。
1.Diary.java
package com.template.model;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-7-20
* Time: 下午8:13
* To change this template use File | Settings | File Templates.
*/
public class Diary {
private Integer id;
private String title;
private String content;
private List<Comment> comments;
public Diary() {
}
}
2.Diary.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-access="field"> <class name="com.template.model.Diary" table="diary"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="title" column="title" type="java.lang.String"/> <property name="content" column="content" type="java.lang.String"/> <bag name="comments" table="comment"> <key column="diaryid"/> <one-to-many class="com.template.model.Comment"/> </bag> </class> </hibernate-mapping>
3.Comment.java
package com.template.model;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-7-20
* Time: 下午8:13
* To change this template use File | Settings | File Templates.
*/
public class Comment {
private Integer id;
private String content;
private Diary diary;
public Comment() {
}
}
4.Comment.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-access="field"> <class name="com.template.model.Comment" table="comment"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="content" column="content" type="java.lang.String"/> <many-to-one name="diary" class="com.template.model.Diary" column="diaryid"/> </class> </hibernate-mapping>
省去Diary与Comment对应的sql语句,相信从Diary.hbm.xml和Comment.hbm.xml映射文件中应该能够知道sql语句是什么样的结构。在comment表中添加了一个diaryid字段来维护Diary与Comment的一对多的关联关系。
如果你只希望从一方能够得到多方,即从一篇日志知道它有哪些评论,而不希望从多方得到一方,即从一条评论无法知道它属于哪篇日志。那么你只需要做一点小小的改动就够了,如下示:
5.Comment.java
package com.template.model;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-7-20
* Time: 下午8:13
* To change this template use File | Settings | File Templates.
*/
public class Comment {
private Integer id;
private String content;
public Comment() {
}
}
6.Comment.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping default-access="field"> <class name="com.template.model.Comment" table="comment"> <id name="id" column="id" type="java.lang.Integer"> <generator class="native"/> </id> <property name="content" column="content" type="java.lang.String"/> </class> </hibernate-mapping>
即把diary属性删除即可,但是一定记住不能把comment表中的diaryid字段也删除了,那样Diary与Comment也就不存在一对多的关联了。