1.one-to-many 的单向
one-to-many的单向是指在一端维护关系,一端用set存储多端对象,由于one-to-many 在添加或维护关系时比较麻烦,开发中不建议使用one-to-many的单向。
one-to-many 的单向如何表示,举例说明一下
一对多关系:Message (留言)和Comment(评论)
实例如下:
Message对象:
public Class Message{
private int id;
private String title;
private String content;
private Set<Comment> comments;
(getter和setter方法)
}
Comment对象:
public Class Comment{
private int id;
private String content;
(getter和setter方法)
}
hibernate的配置如下
Message.hbm.xml:
<hibernate-mapping package="bo">
<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 用来指定在对方的外键的名称 -->
<key column="msgId"/>
<!-- class用来设置列表中的对象类型 -->
<one-to-many class="Comment" />
</set>
</class>
</hibernate-mapping>
Comment.hbm.xml:
<hibernate-mapping package="bo">
<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("123432343");
Comment c2=new Comment();
c2.setContent("sssss");
session.save(c1);
session.save(c2);
Message msg=new Message();
msg.setTitle("ssss");
msg.setContent("agbdfjeirje");
msg.addComment(c1);
msg.addComment(c2);
session.save(msg);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
if(session!=null) session.getTransaction().rollback();
}finally{
if(session!=null) session.close();
}
}
/**
* 执行结果:Hibernate: insert into t_comment (content) values (?)
Hibernate: insert into t_comment (content) values (?)
Hibernate: insert into t_msg (title, content) values (?, ?)
Hibernate: update t_comment set msgId=? where id=?
Hibernate: update t_comment set msgId=? where id=?
*/
@Test
public void testLoad(){
Session session=null;
try{
session=HibernateUtil.openSession();
Message msg=(Message) session.load(Message.class, 1);
System.out.println(msg.getContent());
for(Comment comment:msg.getComments()){
System.out.println(comment.getContent());
}
/**
* 执行结果
* Hibernate: select message0_.id as id4_0_, message0_.title as title4_0_, message0_.content as content4_0_ from t_msg message0_ where message0_.id=?
agbdfjeirje
Hibernate: select comments0_.msgId as msgId4_1_, comments0_.id as id5_1_, comments0_.id as id5_0_, comments0_.content as content5_0_ from t_comment comments0_ where comments0_.msgId=?
sssss
123432343
*/
}catch(Exception e){
e.printStackTrace();
}finally{
if(session!=null) session.close();
}
}
//特别注意:oneToMany 在添加和维护关系比较麻烦,所以开发包中不建议使用one-to-Many的单向
2.one-to-many 的双向
学生和班级的关系是一对多的关系,在Student实体类这方加入属性为ClassRoom classRoom,在ClassRoom这端增加Set students,同时配置文件增加:
最佳实践就是不要使用1的一方来维护关系,在配置文件的set标签中可以通过inverse=true来明确不使用一的这一端维护关系