转自:http://blog.sina.com.cn/s/blog_7b9edd020100racc.html
这两个属性都用于一多对或者多对多的关系中。而inverse特别是用于双向关系,在单向关系中我们并不需要。
Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。
Cascade:
Cascade属性的可能值有
Inverse:
Inverse属性的可能值是true或者false,默认为false:
1、cascade(级联)
2、inverse(控制方向反转)
ps:这里的维护指的是当主控放进行增删改查操作时,会同时对关联关系进行对应的更新。
----------------------------------------------------------------------------------------------------------------------------
父子类:
- public
class Child { -
private int id; -
private String name; -
private Parent parent; -
public int getId() { -
return id; -
} -
-
```` other geter 、setter````` - }
-
- ---------------------------------------------------------
- public
class Parent { -
private int id; -
private String name; -
private Set children; -
public int getId() { -
return id; -
} -
```` other geter 、setter````` - }
配置文件:
- <hibernate-mapping>
-
<class name="model.Child"> -
<id name="id"> -
<generator class="native"></generator> -
</id> -
<property name="name"></property> -
<many-to-one name="parent" column="parent_id" ></many-to-one> -
</class> - </hibernate-mapping>
-
-
-
- <hibernate-mapping>
-
<class name="model.Parent" > -
<id name="id"> -
<generator class="native"></generator> -
</id> -
<property name="name" /> -
<set name="children" cascade="all" inverse="true" >//请注意这里的变化 -
<key column="parent_id"/> -
<one-to-many class="model.Child"/> -
</set> -
</class> - </hibernate-mapping>
测试代码:
- public
void testSaveParent(){ -
Session session=HibernateUtils.getSession(); -
-
session.beginTransaction(); -
-
Parent parent=new Parent(); -
-
Child child=new Child(); -
child.setName("child"); -
child.setParent(parent); -
//session.save(child); -
-
Set children=new HashSet(); -
children.add(child); -
-
parent.setName("parent"); -
parent.setChildren(children); -
//保存parent -
session.save(parent); -
-
session.flush(); -
session.getTransaction().commit(); -
- }
下面分几种情况对上面配置文件中注意的地方进行修改:
1、不设置cascade和inverse 属性
- <set
name="children" >
- Hibernate:
insert into Parent (name) values (?) - Hibernate:
update Child set parent_id=? where id=? - 953
[main] ERROR org.hibernate.event.def.AbstractFlushingEventLis tener - Could not synchronize database state with session - org.hibernate.TransientObjectException
: object references an unsaved transient instance - save the transient instance before flushing: model.Child
- Hibernate:
insert into Child (name, parent_id) values (?, ?) - Hibernate:
insert into Parent (name) values (?) - Hibernate:
update Child set name=?, parent_id=? where id=? - Hibernate:
update Child set parent_id=? where id=?
2、只设置inverse属性
- <set
name="children" inverse="true" >
- Hibernate:
insert into Parent (name) values (?)
3、只设置cascade 属性
- <set
name="children" cascade="all" >
- Hibernate:
insert into Parent (name) values (?) - Hibernate:
insert into Child (name, parent_id) values (?, ?) - Hibernate:
update Child set parent_id=? where id=?
4、同时设置cascade 属性和inverse属性
- <set
name="children" cascade="all" inverse="true" >
- Hibernate:
insert into Parent (name) values (?) - Hibernate:
insert into Child (name, parent_id) values (?, ?)
总结: