Hibernate笔记(一对多映射)java
特别注意,oneToMany在添加和维护关系时比较麻烦,因此在开发中不建议使用OneToMany的单向sql
一对多映射 (一条信息多条评论)session
作法:在一的一方添加一个Set集合来管理多的一方,并在Hbm配置文件中添加相应的关联app
信息类:测试
package com.uujava.hib.model;spa
import java.util.HashSet;.net
import java.util.Set;hibernate
public class Message {xml
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>
测试方法:
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);
}
}