深入研究Hibernate之二:单向一对多


继续接着上篇说,这次是一对多

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=?

顶一个

这文章写的不错





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值