??xml version="1.0" encoding="utf-8" standalone="yes"?>aa亚洲一区一区三区,国产精品免费一区二区三区都可以,久久中文久久字幕http://www.aygfsteel.com/migrant/category/41324.html我们的失落…?/description>zh-cnThu, 27 Aug 2009 21:42:23 GMTThu, 27 Aug 2009 21:42:23 GMT60- [转]Hibernate saveorUpdate与unsaved-valueQsaveQupdateQdeleteȝhttp://www.aygfsteel.com/migrant/archive/2009/08/27/292815.htmlJ2EE学习W记J2EE学习W记Thu, 27 Aug 2009 06:44:00 GMThttp://www.aygfsteel.com/migrant/archive/2009/08/27/292815.htmlhttp://www.aygfsteel.com/migrant/comments/292815.htmlhttp://www.aygfsteel.com/migrant/archive/2009/08/27/292815.html#Feedback0http://www.aygfsteel.com/migrant/comments/commentRss/292815.htmlhttp://www.aygfsteel.com/migrant/services/trackbacks/292815.htmlq些操作对经怋用hibernate的同学已l很熟悉了,我也l常用但一些细节ƈ不了解,
最q遇到问题才开始有看了一下?/span>
在读完robbin的这两个_֍贴的时候,感觉清晰了很多,实好文章?
http://www.javaeye.com/topic/2712
http://www.javaeye.com/topic/1604?page=1
q有q个_֍?
http://www.javaeye.com/topic/7484
也很不错?/span>
里面ȝ的很好了Q我l合以上三个帖子、自q试验Q版本hibernate-3.0.5Q和Hibernate文档也ȝ了一点,加深理解?strong>希望对刚开始学Hibernate的同学有所帮助?/strong>
一、saveorUpdate与unsaved-value
到底是savaq是update
Hibernate需要判断被操作的对象究竟是一个已l持久化q的持久对象q是临时对象?
1Q.主键Hibernate的id generator产生
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
Project project = new Project();
project.setId(XXX);
this.projectDao.saveOrUpdate(project);
1、默认unsaved-value="null"
主键是对象类型,hebernate判断project的主键是否位nullQ来判断project是否已被持久?/strong>
是的话,对project对象发送save(project)Q?
若自p|了主键则直接生成update的sqlQ发送update(project)Q即便数据库里没有那条记录?
主键是基本类型如int/long/double/
自己讄unsaved-null="0"?
所以这L话save和update操作肯定不会报错?/span>
2、unsaved-value="none"Q?
׃不论主键属性ؓM|都不可能为noneQ因此HibernateL对project对象发送update(project)
3、unsaved-value="any"
׃不论主键属性ؓM|都肯定ؓanyQ因此HibernateL对project对象发送save(project)Qhibernate生成主键?/span>
Hibernate文档中写?
saveOrUpdate()完成了如下工作:
如果对象已经在这个session中持久化q了Q什么都不用?
如果对象没有标识|调用save()来保存它
如果对象的标识gunsaved-value中的条g匚wQ调用save()来保存它
如果对象使用了版?version或timestamp),那么除非讄unsaved-value="undefined",版本查会发生在标识符查之?
如果q个session中有另外一个对象具有同L标识W,抛出一个异?
2Q.主键p己来赋?/strong>
<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="assigned" />
</id>
Project project = new Project();
project.setId(XXX);
this.projectDao.saveOrUpdate(project);
1、默认unsaved-value="null"
q时有所不同Qhibernate会根据主键生一个selectQ来判断此对象是否已被持久化
已被持久化则updateQ未被持久化则save?
2、unsaved-value="none"Qupdate对象Q同?/span>
3、unsaved-value="any" Qsave对象Q?
如果自己自己讄的ID在数据库中已存在Q则报错?/span>
二、save与update操作
昑ּ的用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value?
在同一SessionQsave没什么可说得
update对象? 最直接的更改一个对象的Ҏ是load()它,保持Session打开Q然后直接修改即?
Session s =…
Project p = (Project) sess.load(Project.class, id) );
p.setName(“test”);
s.flush();
不用调用s.update(p);hibernate能察觉到它的变化Q会自动更新。当然显C用的话也不会?/span>
Hibernate文档中写?
update()Ҏ在下列情形下使用Q?
E序在前面的session中装载了对象
对象被传递到UIQ界面)?
对该对象q行了一些修?
对象被传递回业务?
应用E序在第二个session中调用update()保存修改
三、delete操作
删除时直接自己构造一个project卛_删除
this.projectDao.delete(preojct);
以前删除我是q样写的
public void deleteProject(String id) {
Project project = (Project) this.projectDao.get(Project.class, id);
if (project != null) {
this.projectDao.delete(project);
}
卌样也是可以的
Project project = new Project();
project.setId(id);
this.projectDao.delete(project).
如果有联关p,需要把U联的子cM构造出来addq去Q同样可以删除?/span>
好了Q罗嗦的够多了?/span>

]]>- [转]Hibernate映射配置文g中id标签的unsaved-value属性详?/title>http://www.aygfsteel.com/migrant/archive/2009/08/17/291567.htmlJ2EE学习W记J2EE学习W记Mon, 17 Aug 2009 14:41:00 GMThttp://www.aygfsteel.com/migrant/archive/2009/08/17/291567.htmlhttp://www.aygfsteel.com/migrant/comments/291567.htmlhttp://www.aygfsteel.com/migrant/archive/2009/08/17/291567.html#Feedback0http://www.aygfsteel.com/migrant/comments/commentRss/291567.htmlhttp://www.aygfsteel.com/migrant/services/trackbacks/291567.html当你昑ּ的用session.save()或者session.update()操作一个对象的时候,实际上是用不?span style="font-family: " class="hilite2">unsaved-value的。某些情况下(父子表关联保?Q当你在E序中ƈ没有昑ּ的用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已l持久化q的持久对象Q是一个尚未被持久化过的内存时对象。例如:
Session session =
;
Transaction tx =
;

Parent parent = (Parent); session.load(Parent.class, id);;

Child child = new Child();;
child.setParent(parent);;
child.setName("sun");;

parent.addChild(child);;
s.update(parent);;

s.flush();;
tx.commit();;
s.close();;
在上例中Q程序ƈ没有昑ּ的session.save(child); 那么Hibernate需要知道childI竟是一个时对象,q是已经在数据库中有的持久对象。如果child是一个新创徏的时对?本例中就是这U情?Q那?span style="font-family: " class="hilite1">Hibernate应该自动产生session.save(child)q样的操作,如果child是已l在数据库中有的持久对象Q那?span style="font-family: " class="hilite1">Hibernate应该自动产生session.update(child)q样的操作?
因此我们需要暗CZ?span style="font-family: " class="hilite1">HibernateQ究竟child对象应该对它自动saveq是update。在上例中,昄我们应该暗示Hibernate对child自动saveQ而不是自动update。那?span style="font-family: " class="hilite1">Hibernate如何判断I竟对child是saveq是update呢?它会取一下child的主键属?child.getId() Q这里假设id?java.lang.Integercd的。如果取到的Id值和hbm映射文g中指定的unsave-value相等Q那?span style="font-family: " class="hilite1">Hibernate认ؓchild是新的内存时对象,发送saveQ如果不相等Q那?span style="font-family: " class="hilite1">Hibernate认ؓchild是已l持久过的对象,发送update?
unsaved-value="null" (默认情况Q适用于大多数对象cd主键 Integer/Long/String/...)
?span style="font-family: " class="hilite1">Hibernate取一下child的IdQ取出来的是null(在上例中肯定取出来的是null)Q和unsaved-value讑֮值相{,发送save(child)
?span style="font-family: " class="hilite1">Hibernate取一下child的idQ取出来的不是nullQ那么和unsaved-value讑֮g相等Q发送update(child)
例如下面的情况:
Session session =
;
Transaction tx =
;

Parent parent = (Parent); session.load(Parent.class, id);;
Child child = (Child); session.load(Child.class, childId);;

child.setParent(parent);;
child.setName("sun");;

parent.addChild(child);;
s.update(parent);;

s.flush();;
tx.commit();;
s.close();;
child已经在数据库中有了,是一个持久化的对象,不是新创建的Q因此我们希?span style="font-family: " class="hilite1">Hibernate发送update(child)Q在该例中,Hibernate取一下child.getId()Q和unsave-value指定的null比对一下,发现不相{,那么发送update(child)?
BTW: parent对象不需要操心,因ؓE序昑ּ的对parent有load操作和update的操作,不需?span style="font-family: " class="hilite1">Hibernate自己来判断究竟是saveq是update了。我们要注意的只是child对象的操作。另?span style="font-family: " class="hilite2">unsaved-value是定义在Childcȝ主键属性中的?br />
<class name="Child" table="child">
<id column="id" name="id" type="integer" unsaved-value="null">
<generator class="identity"/>
</id>


</class>
如果主键属性不是对象型Q而是基本cdQ如int/long/double/...Q那么你需要指定一个数值型?span style="font-family: " class="hilite2">unsaved-valueQ例如:
unsaved-value="0"
在此提醒大家Q很多h以ؓ对主键属性定义ؓint/longQ比定义为Integer/Longq行效率来得高,认ؓ基本cd不需要进行对象的装和解构操作,因此喜欢把主键定义ؓint/long的。但实际上,Hibernate内部L把主键{换ؓ对象型进行操作的Q就你定义为int/long型的Q?span style="font-family: " class="hilite1">Hibernate内部也要q行一ơ对象构造操作,q回l你的时候,q要q行解构操作Q效率可能反而低也说不定。因此大家一定要扭{一个观点,?span style="font-family: " class="hilite1">Hibernate中,主键属性定义ؓ基本cdQƈ不能够比定义为对象型效率来的高,而且也多了很多麻烦,因此大家使用对象型的Integer/Long定义主键?
unsaved-value="none"?
unsaved-value="any"
M要用在主键属性不是通过Hibernate生成Q而是E序自己setId()的时候?
在这里多说一句,强烈使用Hibernate的id generatorQ或者你可以自己扩展Hibernate的id generatorQ特别注意不要用有实际含义的字D当做主键来用!例如用户cUserQ很多h喜欢用用L陆名U做Z键,q是一个很不好的习惯,当用L和其他实体类有关联关pȝ时候,万一你需要修改用L陆名Uͼ一改就需要改好几张表中的数据。偶合性太高,而如果你使用无业务意义的id generatorQ那么修改用户名Uͼ只修改user表就行了?
p个问题引甛_来,如果你严格按照这个原则来设计数据库,那么你基本上是用不到手工来setId()的,你用Hibernate的id generatorOK了。因此你也不需要了解当
unsaved-value="none"?
unsaved-value="any"
I竟有什么含义了。如果你非要用assigned不可Q那么l解释一下:
unsaved-value="none" 的时候,׃不论主键属性ؓM|都不可能为noneQ因?span style="font-family: " class="hilite1">HibernateL对child对象发送update(child)
unsaved-value="any" 的时候,׃不论主键属性ؓM|都肯定ؓanyQ因?span style="font-family: " class="hilite1">HibernateL对child对象发送save(child)
大多数情况下Q你可以避免使用assignedQ只有当你用复合主键的时候不得不手工setId()Q这时候需要你自己考虑I竟怎么讄unsaved-value了,Ҏ你自q需要来定?
BTW: Gavin King强烈不徏议用composite-idQ强烈徏议用UserType?
因此Q如果你在系l设计的时候,遵@如下原则Q?
1、?span style="font-family: " class="hilite1">Hibernate的id generator来生成无业务意义的主键,不用有业务含义的字D做主键Q不使用assigned?
2、用对象类?String/Integer/Long/...)来做主键Q而不使用基础cd(int/long/...)做主?
3、不使用composite-id来处理复合主键的情况Q而用UserType来处理该U情c?/span>
那么你永q用的是unsaved-value="null" Q不可能用到any/none/..了?

]]>
վ֩ģ壺
կ|
|
|
|
|
|
Ҫ|
|
û|
ƽ|
Ͽ|
Ϫ|
Զ|
|
ʤ|
|
|
|
Ȫ|
|
ɽ|
ͺ|
|
|
|
|
|
Ϲ|
ϼ|
ٰ|
ͤ|
|
|
״|
|
|
|
|
ƽ̶|
|
|