在hibernate中实现一对多的关联映射。
1、多的一方实体类:
public class Book {
private int id;
private String bookName;
private String bookAuthor;
private double bookPrice;
private Poet poet;//一的一方,在多的一方需要维护一个一的一方的引用。
/**
这下面为get/set方法
*/
}
2、一的一方实体类:
private int id;
private String name;
private int age;
private Set<Book> book = new HashSet<>();//需要将多的一方直接创建出来。使用泛型,表明多的一方的类型。
/**
这下面为get/set方法
*/
}
3、Book类的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bean.Book">
<id name="id"><generator class="native"></generator></id>
<property name="bookName" type="string"></property>
<property name="bookAuthor" type="string"></property>
<property name="bookPrice" type="double"></property>
<many-to-one name="poet" class="com.bean.Poet" column="poet_id"/>
</class>
</hibernate-mapping>
Poet类的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bean.Poet">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name" type="string"></property>
<property name="age" type="int"></property>
<!-- 特别要注意这个cascade这个属性,必须有,且为all -->
<set name="book" table="poet_books" cascade="all">
<key column="poet_id"></key>
<one-to-many class="com.bean.Book"></one-to-many>
</set>
</class>
</hibernate-mapping>
4、测试代码:
@Test
public void saveComplexset(){
Book b1 = new Book("红楼梦", "曹雪芹", 34);
Book b2 = new Book("活着", "余华", 34.58);
Poet p = new Poet();
p.setAge(84);
p.setName("刘4");
Set<Book> set = new HashSet<>();
set.add(b2);
set.add(b1);
b1.setPoet(p);//这两句话不可少,将多于一关联在一起。
b2.setPoet(p);//这两句话不可少,将多于一关联在一起。
p.setBook(set);
//下面这行代码,用了一个工具类来获取hibernate的session对象
//自己只要获取session对象即可,不管用什么方法
Session session = HibernateUtil.getSession();
Transaction tran = session.beginTransaction();
session.save(p);
System.out.println("保存成功");
tran.commit();
session.close();
}
5、按照上面的内容,亲测hibernate-core-5.1.0.Final.jar完全可以跑的通。初次写作多多指教。
热门评论
1. 在一对多的删除中,应该注意一个问题。当删除多的一方时,应该在删除后从那个一的一方的对象中将删除的对象从那个集合中再次删除,不然会报错,删除不成功。