Message.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.yanglg.hibernate.domain"> <class name="Message" table="t_message"> <id name="id"> <generator class="native"></generator> </id> <property name="title" length="20" /> <property name="content" length="100" /> <set name="comments"> --->>一组数据 <key column="message_id" /> 对端外键的字段名 <one-to-many class="Comment"/> --对端的类名 </set> </class> </hibernate-mapping>
Message实体类:
package org.yanglg.hibernate.domain;
import java.util.HashSet;
import java.util.Set;
public class Message {
private int id;
private String title;
private String content;
private Set<Comment> comments;
public Message() {
comments = new HashSet<Comment>();
}
public void addComment(Comment comment) {
comments.add(comment);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Set<Comment> getComments() {
return comments;
}
public void setComments(Set<Comment> comments) {
this.comments = comments;
}
}
Comment.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.yanglg.hibernate.domain">
<class name="Comment" table="t_comment">
<id name="id">
<generator class="native"></generator>
</id>
<property name="content" length="100" />
</class>
</hibernate-mapping>
Comment实体类:
package org.yanglg.hibernate.domain;
public class Comment {
private int id;
private String content;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
下面是Test
package org.yanglg.hibernate.domain;
import org.hibernate.Session;
import org.junit.Test;
import org.yanglg.hibernate.HibernateUtil;
public class OneToManyTest {
@Test
public void add() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Comment t1 = new Comment();
t1.setContent("这文章写的不错");
Comment t2 = new Comment();
t2.setContent("顶一个");
Message message = new Message();
message.setTitle("abc");
message.setContent("def");
message.addComment(t1);
message.addComment(t2);
session.save(t1);
session.save(t2);
session.save(message);
session.getTransaction().commit();
} catch (Exception e) {
if (session != null) {
session.getTransaction().rollback();
}
e.printStackTrace();
} finally {
HibernateUtil.closeSession(session);
}
}
@Test
public void addLoad() {
Session session = null;
try {
session = HibernateUtil.openSession();
Message message =(Message) session.load(Message.class, 23);
System.out.println(message);
System.out.println(message.getComments().size());
for (Comment c : message.getComments()) {
System.out.println(c.getContent());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
HibernateUtil.closeSession(session);
}
}
}
很明显,这里有跟多对一时先保存一的一端在用多的一端设置一的一端一样的问题,会多发两个update语句,所以 单向一对多维护关系是比较麻烦的,不建议使用它!
<set name="comments" lazy="extra">
<key column="message_id" />
<one-to-many class="Comment" />
</set>
而加上lazy=extra时,会更加的智能一些,会根据取值不通来判断
org.yanglg.hibernate.domain.Message@12fb0af
Hibernate: select count(id) from t_comment where message_id =?
2
Hibernate: select comments0_.message_id as message3_3_1_, comments0_.id as id4_1_, comments0_.id as id4_0_, comments0_.content as content4_0_ from t_comment comments0_ where comments0_.message_id=?
顶一个
这文章写的不错