hibernate多对一,在一的一方保存问题,新手问题,希望能得到解答,万分感谢
先来看下代码,这是配置文件
- XML code
<?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="com.linuslan.model"> <class name="Category" table="CATEGORIES"> <id name="id" column="ID"> <generator class="sequence"> <param name="sequence">CATEGORIES_SEQ</param> </generator> </id> <property name="name" column="NAME"></property> <many-to-one name="parentCategory" column="CATEGORY_ID" class="com.linuslan.model.Category" cascade="save-update" lazy="false"></many-to-one> <set name="childCategories" table="CATEGORIES" inverse="true" cascade="all-delete-orphan"> <key column="CATEGORY_ID"></key> <one-to-many class="com.linuslan.model.Category"/> </set> </class></hibernate-mapping>
以下是实体类的源代码
- Java code
package com.linuslan.model;import java.util.HashSet;import java.util.Set;public class Category { private Long id; private String name; private Category parentCategory; private Set<Category> childCategories = new HashSet<Category>(); public Category() { } public Category(String name, Set<Category> childCategories, Category parentCategory) { this.name = name; this.childCategories = childCategories; this.parentCategory = parentCategory; } public Long getId() { return id; } @SuppressWarnings("unused") private void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Category getParentCategory() { return parentCategory; } public void setParentCategory(Category parentCategory) { this.parentCategory = parentCategory; } public Set<Category> getChildCategories() { return childCategories; } public void setChildCategories(Set<Category> childCategories) { this.childCategories = childCategories; } }
以下是实验的源代码
- Java code
package com.linuslan.business;import java.util.HashSet;import java.util.Iterator;import java.util.List;import java.util.Set;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import com.linuslan.model.Category;import com.linuslan.util.HibernateUtil;public class CategoryBusinessService { public void saveParentCategory() { Category food = new Category(); food.setName("food"); Category fruit = new Category(); fruit.setName("fruit"); Category vegetable = new Category(); vegetable.setName("vegetable"); Set<Category> secondChildCategories = new HashSet<Category>(); secondChildCategories.add(fruit); secondChildCategories.add(vegetable); food.setChildCategories(secondChildCategories); Session session = this.sessionFactory.openSession(); session.beginTransaction(); session.save(food); session.getTransaction().commit(); session.close(); }}
假如我就这样写的话,运行之后,就只是将各个实体保存下来了,而不会将他们的关系插入数据库,运行后数据库里的数据是这样的
IDNAME Category_id
1food
2fruit
3vegetable
而我一开始觉的他们应该是这样的
IDNAME Category_id
1food
2fruit 1
3vegetable1
这是为什么呢?
而从多的一方保存,例如下面的代码
- Java code
public void saveChildCategory() { Category food = new Category(); food.setName("Food"); Category fruit = new Category(); fruit.setName("fruit"); fruit.setParentCategory(food); Session session = this.sessionFactory.openSession(); session.beginTransaction(); session.save(fruit); session.getTransaction().commit(); session.close(); }
fruit是多的一方的实例,food是一的那一方的实例
运行后得到的数据库如下:
IDNAMECategory_id
1food
2fruit 1
也就是说从单的那方保存,则Category_id为空的,而从多的那一方保存,则Category_id会插入,这是为什么呢?麻烦各位大神帮我解答下。感激不尽,领表涕零。
[解决办法]
关键在于inverse关键字,你设置为true,也就是由多的一方来维护关联关系。那么你下面保存的时候,只要保存多的一方的数据即可。设置为false,则保存一的一方即可。