Hibernate笔记(一对多映射)
特别注意,oneToMany在添加和维护关系时比较麻烦,所以在开发中不建议使用OneToMany的单向
一对多映射 (一条信息多条评论)
做法:在一的一方添加一个Set集合来管理多的一方,并在Hbm配置文件中添加相应的关联
信息类:
package com.uujava.hib.model;
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);
}
//所有属性的set get方法
}
评论类:
package com.uujava.hib.model;
public class Comment {
private int id;
private String content;
}
//所有属性的set get方法
}
Message.hbm.xml映射配置
<?xml version="1.0"?>
<!--dtd-->
<hibernate-mapping package="com.uujava.hib.model">
<class name="Message" table="t_msg">
<id name="id"><!-- 表示不会自动生成,而是需要由用户来指定 -->
<generator class="native"/>
</id>
<property name="title"/>
<property name="content"/>
<!-- 使用了lazy=extra之后会稍微智能一些,会根据去的值的不同来判断是调用count和获取投影 -->
<set name="comments" lazy="extra">
<key column="mid"/><!-- key用来指定在对方的外键的名称 -->
<one-to-many class="Comment"/><!-- class用来设置列表中的对象类型 -->
</set>
</class>
</hibernate-mapping>
Comment.hbm.xml 映射配置
<?xml version="1.0"?>
<!--dtd约束-->
<hibernate-mapping package="com.uujava.hib.model">
<class name="Comment" table="t_comment">
<id name="id">
<generator class="native" />
</id>
<property name="content" />
</class>
</hibernate-mapping>
测试方法:
@Test
public void testAdd() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();
Comment c1 = new Comment();c1.setContent("123123123");
Comment c2 = new Comment();c2.setContent("1sdsfdfsdf");
session.save(c1); session.save(c2);
Message msg = new Message();
msg.setTitle("sdfsdfsdfsdf");msg.setContent("sdfsdfsdfsdf");
msg.addComment(c1);msg.addComment(c2);
session.save(msg);
session.getTransaction().commit();//此时会发出5条sql,三条查询,两条更新
} catch (Exception e) {
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}