Hibernate三钟状态态以及级联设置
转自 http://www.javaeye.com/topic/727093
自己总结的,从博客转来,希望有帮助
有些东西不搞懂心理始终没底,特意翻出来总结下:
Hibernate对象有三种状态:
瞬时状态(Transient):new出来的对象,或者从前端传来的对象。反正不是从数据库来的对象
持久状态(Persistent):已数据库交互过数据的对象:get、load,save、update。。。
脱管状态(Detached):本来是Persistent的数据,但session关闭或者clear了,其实跟Transient效果基本一样
网上抄个图:
注意的地方:
1.如果对象A关联对象B,而B又是Transient装态,有可能直接save、update (A)会报错,要么先save、update(B)对象一下,要么将B的级联设置为@ManyToOne(cascade=CascadeType.MERGE)
2如果是Persistent状态对象,无需update自动会保持数据同步
级联设置:
CascadeType.PERSIST
CascadeType.MERGE
CascadeType.REMOVE
CascadeType.ALL
CascadeType.REFRESH
Class A{
Class B; 我的理解是,相当于是定义B类在A类发生什么变化的时候做出级联操作(新增、跟新或者删除)
}
CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
CascadeType.MERGE指A类新增或者变化,会级联B对象(新增或者变化)
CascadeType.REMOVE只有A类删除时,会级联删除B类;
CascadeType.ALL包含所有;
CascadeType.REFRESH没用过。
综上:大多数情况用CascadeType.MERGE就能达到级联跟新又不报错,用CascadeType.ALL时要斟酌下CascadeType.REMOVE
自己总结的,从博客转来,希望有帮助
有些东西不搞懂心理始终没底,特意翻出来总结下:
Hibernate对象有三种状态:
瞬时状态(Transient):new出来的对象,或者从前端传来的对象。反正不是从数据库来的对象
持久状态(Persistent):已数据库交互过数据的对象:get、load,save、update。。。
脱管状态(Detached):本来是Persistent的数据,但session关闭或者clear了,其实跟Transient效果基本一样
网上抄个图:
注意的地方:
1.如果对象A关联对象B,而B又是Transient装态,有可能直接save、update (A)会报错,要么先save、update(B)对象一下,要么将B的级联设置为@ManyToOne(cascade=CascadeType.MERGE)
2如果是Persistent状态对象,无需update自动会保持数据同步
级联设置:
CascadeType.PERSIST
CascadeType.MERGE
CascadeType.REMOVE
CascadeType.ALL
CascadeType.REFRESH
Class A{
Class B; 我的理解是,相当于是定义B类在A类发生什么变化的时候做出级联操作(新增、跟新或者删除)
}
CascadeType.PERSIST只有A类新增时,会级联B对象新增。若B对象在数据库存(跟新)在则抛异常(让B变为持久态)
CascadeType.MERGE指A类新增或者变化,会级联B对象(新增或者变化)
CascadeType.REMOVE只有A类删除时,会级联删除B类;
CascadeType.ALL包含所有;
CascadeType.REFRESH没用过。
综上:大多数情况用CascadeType.MERGE就能达到级联跟新又不报错,用CascadeType.ALL时要斟酌下CascadeType.REMOVE