读书人

hibernate多对一在一的一方保存有关

发布时间: 2012-10-09 10:21:45 作者: rapoo

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,则保存一的一方即可。

读书人网 >J2EE开发

热点推荐