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);
}
}