﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java技术-随笔分类-JPA</title><link>http://www.blogjava.net/justfang/category/42814.html</link><description>hibernate spring struts</description><language>zh-cn</language><lastBuildDate>Tue, 09 Nov 2010 21:33:15 GMT</lastBuildDate><pubDate>Tue, 09 Nov 2010 21:33:15 GMT</pubDate><ttl>60</ttl><item><title>cascade="all-delete-orphan" 处理</title><link>http://www.blogjava.net/justfang/archive/2010/11/09/337639.html</link><dc:creator>just</dc:creator><author>just</author><pubDate>Tue, 09 Nov 2010 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/justfang/archive/2010/11/09/337639.html</guid><wfw:comment>http://www.blogjava.net/justfang/comments/337639.html</wfw:comment><comments>http://www.blogjava.net/justfang/archive/2010/11/09/337639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justfang/comments/commentRss/337639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justfang/services/trackbacks/337639.html</trackback:ping><description><![CDATA[<p>比如我们现在有一个Parent的实体，在Parent实体当中有一个children的Set<br />
由于这个children的数据并非非常重要，为了方便，我们在修改parent的时候，做法经常都是<br />
1,清空children全部删了，再把新的children全部加进去。<br />
今天早上做这一方面工作的时候遇到一个问题，就是在更新parent的时候，报了一个<br />
Don't dereference a collection with cascade="all-delete-orphan"<br />
的异常，经常一半个小时的查资料和调试，终于找到了解决问题的办法<br />
刚刚开始我的做法为：<br />
parent = parentService.findParentById(id);<br />
parent.getChildren.clear();<br />
parent.setChildren(newChildren);<br />
parentService.updateparent(parent);<br />
这样做一定会报出一个Don't dereference a collection with cascade="all-delete-orphan"的异常<br />
原来是，对于parent的children这个Set，它本身是一个持久的集合，该集合存在于hibernate的对象池当中，通过<br />
parent.setChildren(newChildren)的设置之后，本身已经将parent对children集合的引用指到对象池外的一个集合。<br />
后来查询资料后的做法为：<br />
parent = parentService.findParentById(id);<br />
parent.getChildren.clear();<br />
parent.getChildren.addAll(newChildren);<br />
parentService.updateparent(parent);<br />
做了几次测试，问题解决。<br />
hbm配置如下：<br />
&lt;set lazy="true" name="children" cascade="all,delete-orphan" inverse="true"&gt;<br />
&nbsp;&nbsp; &lt;key column="PARENT_ID"/&gt;<br />
&nbsp;&nbsp; &lt;one-to-many class="Child"/&gt;<br />
&lt;/set&gt;<br />
另外，hibernate 3已经将cascade当中的选项做了修改，现在已经没有了all-delete-orphan这个选项，虽然hibernate<br />
内部还是支持这个选项&#8230;&#8230;</p>
<img src ="http://www.blogjava.net/justfang/aggbug/337639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justfang/" target="_blank">just</a> 2010-11-09 16:30 <a href="http://www.blogjava.net/justfang/archive/2010/11/09/337639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>discriminator-value</title><link>http://www.blogjava.net/justfang/archive/2009/11/27/303903.html</link><dc:creator>just</dc:creator><author>just</author><pubDate>Fri, 27 Nov 2009 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/justfang/archive/2009/11/27/303903.html</guid><wfw:comment>http://www.blogjava.net/justfang/comments/303903.html</wfw:comment><comments>http://www.blogjava.net/justfang/archive/2009/11/27/303903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justfang/comments/commentRss/303903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justfang/services/trackbacks/303903.html</trackback:ping><description><![CDATA[<span  style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px; "><span style="font-size: small; ">可能经常遇到这样的情况：</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span></span><span style="font-size: small; ">在数据库表中会有这样的一个字段用来区别记录的属性，如：在客户表中有一个字段表示客户级别，当这个记录为<span lang="EN-US"><span style="font-family: Calibri; ">A</span></span>时是一级客户，为<span lang="EN-US"><span style="font-family: Calibri; ">B</span></span>时是二级客户。在用<span lang="EN-US"><span style="font-family: Calibri; ">hiberante</span></span>做<span lang="EN-US"><span style="font-family: Calibri; ">OR</span></span>表示时类可能是这样的：</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public class Customer{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; private String flag;&nbsp;&nbsp; //</span></span><span style="font-size: small; ">表示客户的级别</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</span></span><span style="font-size: small; ">然后，在程序中手动控制<span lang="EN-US"><span style="font-family: Calibri; ">flag</span></span>的值，但是这样当每个级的客户有不同的属性时<span lang="EN-US"><span style="font-family: Calibri; ">Customer</span></span>类将包含所有级别的属性，这样不是很好。</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; hibernate</span></span><span style="font-size: small; ">提供一个<span lang="EN-US"><span style="font-family: Calibri; ">Discriminator</span></span>映射的方法，就是把一个表映射成不同的类，有不同的属性。</span><span lang="EN-US"><br />
<br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public class Customer{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; //</span></span><span style="font-size: small; ">包含所有级别的公共属性</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public class CustomerA extends Customer{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //</span></span><span style="font-size: small; ">只包括一级客户的特有属性</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public class CustomerB extends Customer{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; //</span></span><span style="font-size: small; ">只包含二级客户特有的属性</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
</span></span><span style="font-size: small; ">这样更符合面向对象的原则，然后在<span lang="EN-US"><span style="font-family: Calibri; ">hbm.xml</span></span>中这样写：</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">&lt;id name="id" type="int"&gt;<br />
&nbsp;&nbsp;&nbsp; ...<br />
&lt;/id&gt;<br />
&lt;discriminator column="flag" type="string" /&gt;<br />
&lt;!--&nbsp;</span></span><span style="font-size: small; ">公共属性的映射</span><span style="font-size: small; "><span lang="EN-US"><span style="font-family: Calibri; ">&nbsp;--&gt;<br />
&lt;subclass name="CustomerA" discriminator-value="A"&gt;<br />
&lt;!--&nbsp;</span></span>一级客户特有属性的映射</span><span style="font-size: small; "><span lang="EN-US"><span style="font-family: Calibri; ">&nbsp;--&gt;<br />
&lt;/subclass&gt;<br />
&lt;subclass name="CustomerB" discriminator-value="B"&gt;<br />
&lt;!--&nbsp;</span></span>二级客户特有属性的映射</span><span style="font-size: small; "><span lang="EN-US"><span style="font-family: Calibri; ">&nbsp;--&gt;<br />
&lt;/subclass&gt;<br />
<br />
</span></span>这样就可以单独的用<span lang="EN-US"><span style="font-family: Calibri; ">CustomerA,CustomerB</span></span>这样的实例了，做数据库修改时就不用关心<span lang="EN-US"><span style="font-family: Calibri; ">flag</span></span>字段的值了，会自动的加<span lang="EN-US"><span style="font-family: Calibri; ">A</span></span>或<span lang="EN-US"><span style="font-family: Calibri; ">B</span></span>。</span><span lang="EN-US"><br />
<br />
</span><span style="font-size: small; ">如果是使用<span lang="EN-US"><span style="font-family: Calibri; ">hibernate Annotation</span></span>而不是<span lang="EN-US"><span style="font-family: Calibri; ">xml</span></span>来描述映谢关系，代码如下：</span><span lang="EN-US"><br />
<span style="font-size: small; font-family: Calibri; ">@Entity<br />
@Table(name = "customer")<br />
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)<br />
@DiscriminatorColumn(name = "flag", discriminatorType = DiscriminatorType.STRING)<br />
public class Customer{<br />
}<br />
<br />
@Entity<br />
@DiscriminatorValue(value = "A")<br />
public class CustomerA extends Customer{<br />
}<br />
<br />
@Entity<br />
@DiscriminatorValue(value = "B")<br />
public class CustomerB extends Customer{<br />
}<br />
<br />
</span></span><span style="font-size: small; ">这样就可以了。</span></span>
<img src ="http://www.blogjava.net/justfang/aggbug/303903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justfang/" target="_blank">just</a> 2009-11-27 15:27 <a href="http://www.blogjava.net/justfang/archive/2009/11/27/303903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA 注解的要点(二)</title><link>http://www.blogjava.net/justfang/archive/2009/11/27/303870.html</link><dc:creator>just</dc:creator><author>just</author><pubDate>Fri, 27 Nov 2009 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/justfang/archive/2009/11/27/303870.html</guid><wfw:comment>http://www.blogjava.net/justfang/comments/303870.html</wfw:comment><comments>http://www.blogjava.net/justfang/archive/2009/11/27/303870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justfang/comments/commentRss/303870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justfang/services/trackbacks/303870.html</trackback:ping><description><![CDATA[<div>1.scope="prototype"的作用<br />
今天在做项目的时候遇到一个问题，同一个action里使用不同的操作（增删改查）的时候总是获得当前系统时间是同一个时间，后来检查了下才知道是spring.xml里的action映射里没有加scope="prototype"属性 &nbsp; &nbsp; &nbsp; scope="prototype"没写的问题,项目中对一个表的增删该操作是用一个action，这个action有add,update,delete,save这些方法，添加和修改是共用一个页面，当页面得到id时代表进行的修改操作，反之是添加操作。因为在配置spring的bean是忘了写scope="prototype"所以每次添加时都显示最后一次访问过的记录,找了很长时间，原来是spring bean出了问题。 scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。如果没有配置scope=prototype则添加的时候不会新建一个action，他任然会保留上次访问的过记录的信息</div>
<img src ="http://www.blogjava.net/justfang/aggbug/303870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justfang/" target="_blank">just</a> 2009-11-27 11:31 <a href="http://www.blogjava.net/justfang/archive/2009/11/27/303870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA 批注参考</title><link>http://www.blogjava.net/justfang/archive/2009/11/10/301766.html</link><dc:creator>just</dc:creator><author>just</author><pubDate>Tue, 10 Nov 2009 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/justfang/archive/2009/11/10/301766.html</guid><wfw:comment>http://www.blogjava.net/justfang/comments/301766.html</wfw:comment><comments>http://www.blogjava.net/justfang/archive/2009/11/10/301766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/justfang/comments/commentRss/301766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/justfang/services/trackbacks/301766.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JPA 全称：JAVA persistence API &nbsp;JAVA持久化API作为 Java 企业版 5 (Java EE 5) Enterprise Java Bean (EJB) 3.0 规范的组成部分，Java 持续性 API (JPA) 显著简化了 EJB 持续性并提供了一个对象关系映射方法，该方法使您可以采用声明方式定义如何通过一种标准的可移植方式（在 Java EE 5 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/justfang/archive/2009/11/10/301766.html'>阅读全文</a><img src ="http://www.blogjava.net/justfang/aggbug/301766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/justfang/" target="_blank">just</a> 2009-11-10 10:00 <a href="http://www.blogjava.net/justfang/archive/2009/11/10/301766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>