﻿<?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-天道酬勤 tiān dào chóu qín-文章分类-hibernate</title><link>http://www.blogjava.net/abram/category/40686.html</link><description>天将降大任于斯人也，必将苦其心志，劳其筋骨          
宠辱不惊，看庭上花开花落；去留无意，望天上云卷云舒</description><language>zh-cn</language><lastBuildDate>Sat, 11 Jul 2009 22:09:18 GMT</lastBuildDate><pubDate>Sat, 11 Jul 2009 22:09:18 GMT</pubDate><ttl>60</ttl><item><title>hibernate 分布式事务的例子</title><link>http://www.blogjava.net/abram/articles/286131.html</link><dc:creator>chong</dc:creator><author>chong</author><pubDate>Thu, 09 Jul 2009 10:25:00 GMT</pubDate><guid>http://www.blogjava.net/abram/articles/286131.html</guid><wfw:comment>http://www.blogjava.net/abram/comments/286131.html</wfw:comment><comments>http://www.blogjava.net/abram/articles/286131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/abram/comments/commentRss/286131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/abram/services/trackbacks/286131.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 对于横跨多个Hibernate SessionFacotry的分布式事务，只需简单地将 JtaTransactionManager 同多个 LocalSessionFactoryBean 的定义结合起来作为事务策略。你的每一个DAO通过bean属性得到各自的 SessionFactory 引用。如果所有的底层JDBC数据源都是支持事务的容器，那么只要业务对象使用了 JtaTransactionMa...&nbsp;&nbsp;<a href='http://www.blogjava.net/abram/articles/286131.html'>阅读全文</a><img src ="http://www.blogjava.net/abram/aggbug/286131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/abram/" target="_blank">chong</a> 2009-07-09 18:25 <a href="http://www.blogjava.net/abram/articles/286131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB/JPA继承详解(转)</title><link>http://www.blogjava.net/abram/articles/285759.html</link><dc:creator>chong</dc:creator><author>chong</author><pubDate>Tue, 07 Jul 2009 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/abram/articles/285759.html</guid><wfw:comment>http://www.blogjava.net/abram/comments/285759.html</wfw:comment><comments>http://www.blogjava.net/abram/articles/285759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/abram/comments/commentRss/285759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/abram/services/trackbacks/285759.html</trackback:ping><description><![CDATA[<span  style="font-family: Verdana; font-size: 13px; line-height: 16px; ">因为关系数据库的表之间不存在继承关系，Entity 提供三种基本的继承映射策略：<br />
每个类分层结构一张表(table per class hierarchy)<br />
每个子类一张表(table per subclass)<br />
每个具体类一张表(table per concrete class)<br />
<br />
<font color="#ff0000">一、每个类分层结构一张表(table per class hierarchy)</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种映射方式只需为基类创建一个表即可。在表中不仅提供基类所有属性对应的字段，还要提供所有子类属性对应的字段，此外还需要一个字段用于区分子类的具体类型<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要使用每个类分层结构一张表(table per class hierarchy) 策略，需要把<font color="#ff0000">@javax.persistence.Inheritance</font>&nbsp;注释的<font color="#0000ff">strategy</font>属性设置为<font color="#3366ff">InheritanceType.SINGLE_TABLE</font>。除非你要改变子类的映射策略，否则<strong><font color="#ff0000">@Inheritance</font>&nbsp;注释只能放在继承层次的基类</strong>。通过鉴别字段的值，持久化引掣可以区分出各个类，并且知道每个类对应那些字段。<font color="#cc99ff">鉴别字段</font>通过<font color="#ff0000">@javax.persistence.DiscriminatorColumn</font>&nbsp;注释进行定义，<font color="#0000ff">name</font>&nbsp;属性定义<font color="#cc99ff">鉴别字段的列名</font><font color="#0000ff"><font color="#000000">，</font>discriminatorType&nbsp;</font>属性定义<font color="#cc99ff">鉴别字段的类型</font>（可选值有：String, Char, Integer），如果鉴别字段的类型为String 或Char，可以用length 属性定义其长度。<font color="#ff0000">@DiscriminatorValue</font>&nbsp;注释为继承关系中的<font color="#cc99ff">每个类定义鉴别值</font>，如果不指定鉴别值，默认采用类名<br />
例:<br />
&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp; @Table(name="Vehicle_Hierarchy")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">@Inheritance(strategy=InheritanceType.SINGLE_TABLE)</font><br />
&nbsp;&nbsp;&nbsp; @DiscriminatorColumn(name="Discriminator",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; discriminatorType = DiscriminatorType.STRING,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; length=30)<br />
&nbsp;&nbsp;&nbsp; @DiscriminatorValue("Vehicle")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Vehicle implements Serializable{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">&nbsp;//基类</font></font><br />
&nbsp;&nbsp;&nbsp; private Long id;<br />
&nbsp;&nbsp;&nbsp; private Short speed;//速度<br />
&nbsp;&nbsp;&nbsp; @Id<br />
&nbsp;&nbsp;&nbsp; @GeneratedValue<br />
&nbsp;&nbsp;&nbsp; @Column(columnDefinition="integer")//指定使用适配Integer长度的数据类型<br />
&nbsp;&nbsp;&nbsp; public Long getId() {<br />
&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setId(Long id) {<br />
&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp; @DiscriminatorValue("Car")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Car extends Vehicle{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">&nbsp;//Vehicle的子类</font></font><br />
&nbsp;&nbsp;&nbsp; private String engine;//发动机<br />
&nbsp;&nbsp;&nbsp; @Column(nullable=true,length=30)<br />
&nbsp;&nbsp;&nbsp; public String getEngine() {<br />
&nbsp;&nbsp;&nbsp; return engine;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; public void setEngine(String engine) {<br />
&nbsp;&nbsp;&nbsp; this.engine = engine;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp; @DiscriminatorValue("Camion")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Camion extends Car{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">//Car的子类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private String container;//集装箱<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(nullable=true,length=30)<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getContainer() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setContainer(String container) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.container = container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<strong><font color="#ff0000">分析:</font></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#800080">可 以看出，每个子类没有单独的映射，在数据库中没有对应的表存在。而只有一个记录所有自身属性和子类所有属性的表，在基类为Vehicle 的时候，Discriminator 字段的值将为Vehicle,在子类为Car 的时候，Discriminator 字段的值将为Car，子类为Camion 的时候，Discriminator 字段的值将为Camion。那么，如果业务逻辑要求Car 对象的engine 属性不允许为null，显然无法在Vehicle_Hierarchy 表中为engine 字段定义not null 约束，可见这种映射方式无法保证关系数据模型的数据完整性。</font><br />
<br />
<font color="#ff0000">二、每个类分层结构一张表(table per class hierarchy)</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种映射方式为每个类创建一个表。在每个类对应的表中只需包含和这个类本身的属性对应的字段，子类对应的表参照父类对应的表,使用每个子类一张表 (table per subclass)策略，需要把@javax.persistence.Inheritance 注释的<strong>strategy&nbsp;</strong>属性设置为<strong>InheritanceType.JOINED<br />
<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">@Inheritance(strategy=InheritanceType.JOINED)</font><br />
&nbsp;&nbsp;&nbsp;&nbsp; @Table(name="Vehicle")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Vehicle implements Serializable{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">&nbsp;//基类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private Long id;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Short speed;//速度<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Id<br />
&nbsp;&nbsp;&nbsp;&nbsp; @GeneratedValue<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(columnDefinition="integer")<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Long getId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setId(Long id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Short getSpeed() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return speed;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setSpeed(Short speed) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.speed = speed;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Table(name="Car")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>@PrimaryKeyJoinColumn(name="CarID")&nbsp;&nbsp;&nbsp;&nbsp; //把主键对应的列名更改为CarID</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Car extends Vehicle{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff"><font color="#ff0000">//Vehicle的子类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private String engine;//发动机<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(nullable=true,length=30)<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getEngine() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return engine;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setEngine(String engine) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.engine = engine;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Table(name="Camion")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>@PrimaryKeyJoinColumn(name="CamionID")&nbsp;&nbsp;&nbsp;&nbsp; //把主键对应的列名更改为CamionID</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Camion extends Car{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff"><font color="#ff0000">//Car的子类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private String container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(nullable=true,length=30)<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getContainer() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setContainer(String container) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.container = container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<font color="#800080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种映射方式支持多态关联和多态查询，而且符合关系数据模型的常规设计规则。在这种策略中你可以对子类的属性对应的字段定义not null 约束。该策略的缺点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它的查询性能不如上面介绍的映射策略。在这种映射策略下，必须通过表的内连接或左外连接来实现多态查询和多态关联。<br />
选择原则：子类属性非常多，需要对子类某些属性对应的字段进行not null 约束，且对性能要求不是很严格时，优先选择该策略</font><br />
<br />
<font color="#ff0000">三、每个具体类一张表(table per concrete class)</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种映射方式为每个类创建一个表。在每个类对应的表中包含和这个类所有属性（包括从超类继承的属性）对应的字段,使用每个具体类一张表(table per concrete class)策略，需要把@javax.persistence.Inheritance 注释的<strong>strategy&nbsp;</strong>属性设置为<strong>InheritanceType.TABLE_PER_CLASS</strong><br />
<br />
<font color="#ff0000"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意:一旦使用这种策略就意味着你不能使用AUTO generator 和IDENTITY generator，即主键值不能采用数据库自动生成.</strong></font><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)</font><br />
&nbsp;&nbsp;&nbsp;&nbsp; @Table(name="Vehicle")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&nbsp;public class Vehicle implements Serializable{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff"><font color="#ff0000">//基类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private Long id;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Short speed;//速度<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Id<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(columnDefinition="integer")<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Long getId() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return id;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setId(Long id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.id = id;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Short getSpeed() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return speed;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setSpeed(Short speed) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.speed = speed;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Table(name="Car")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">public class Car extends Vehicle{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</font><font color="#0000ff"><font color="#ff0000">//Vehicle的子类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private String engine;//发动机<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(nullable=true,length=30)<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getEngine() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return engine;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setEngine(String engine) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.engine = engine;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("serial")<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Table(name="Camion")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"><font color="#0000ff">public class Camion extends Car{&nbsp;&nbsp;&nbsp;</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000ff"><font color="#ff0000">//Car的子类</font></font><br />
&nbsp;&nbsp;&nbsp;&nbsp; private String container;//集装箱<br />
&nbsp;&nbsp;&nbsp;&nbsp; @Column(nullable=true,length=30)<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String getContainer() {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setContainer(String container) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.container = container;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
注意:在查询时,例如:&nbsp;<strong>from Vehicle v</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查询所有Vehicle时，因为他是最继承树中的根，查询结果会得到所有继承于Vehicle类的记录<br />
<font color="#ff0000">(构造的SQL Where部分：<strong>where Discriminator in ('Car', 'Camion')</strong>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000"><strong>delete from Vehicle v</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行该操作会删除自身对应记录，还会删除所有继承Vehicle的记录,因为他是最继承树中的根，就相当于清除整个表的数据<br />
<br />
</font></font><font color="#800080">该策略的优点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这种策略中你可以对子类的属性对应的字段定义not null 约束。<br />
该策略的缺点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不符合关系数据模型的常规设计规则，每个表中都存在属于基类的多余的字段。同时，为了支持策略的映射，持久化管理者需要决定使用什么方法，一种方法是在 entity 载入或多态关联时，容器使用多次查询去实现，这种方法需要对数据库做几次来往查询，非常影响执行效率。另一种方法是容器通过使用SQLUNIOU 查询来实现这种策略。<br />
选择原则：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除非你的现实情况必须使用这种策略，一般情况下不要选择。</font></span>
<img src ="http://www.blogjava.net/abram/aggbug/285759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/abram/" target="_blank">chong</a> 2009-07-07 10:50 <a href="http://www.blogjava.net/abram/articles/285759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标注枚举类型@Enumerated（转）</title><link>http://www.blogjava.net/abram/articles/285757.html</link><dc:creator>chong</dc:creator><author>chong</author><pubDate>Tue, 07 Jul 2009 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/abram/articles/285757.html</guid><wfw:comment>http://www.blogjava.net/abram/comments/285757.html</wfw:comment><comments>http://www.blogjava.net/abram/articles/285757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/abram/comments/commentRss/285757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/abram/services/trackbacks/285757.html</trackback:ping><description><![CDATA[<span  style="font-family: Verdana; font-size: 13px; line-height: 16px; ">
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">实体</span><font face="Times New Roman">Entity</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">中通过</span><font face="Times New Roman">@Enumerated</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">标注枚举类型，例如将</span><font face="Times New Roman">CustomerEO</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">实体中增加一个</span><font face="Times New Roman">CustomerType</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">类型的枚举型属性，标注实体后的代码如下所示。</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">@Entity</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">@Table(name = "customer")</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">public class CustomerEO implements java.io.Serializable {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 21pt; "><span style="line-height: 15px; font-size: 13px; font-family: 黑体; "><font style="background-color: #e0e0e0; ">&#8230;&#8230;</font></span></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private CustomerType type;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Enumerated(EnumType.STRING)</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CustomerType getType() {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setType(CustomerType type) {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public enum CustomerType {</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COMPETITOR, INVESTOR, PARTNER, VENDER</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">}</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">在实体中虽然标注成枚举类型，但当实体持久化后，表中所对应的值仍旧是基本的数据类型，以上代码创建表的</span><font face="Times New Roman">SQL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">语句是：</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">CREATE TABLE customer (</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id int(20) NOT NULL auto_increment,</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name varchar(255),</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type varchar(255),</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIMARY KEY (id)</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">)</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><span style="line-height: 15px; font-size: 13px; font-family: 宋体; "><font size="3">使用枚举类型后，在创建实体时便可以直接引用枚举类型，例如以下代码所示。</font></span></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">CustomerEO customer = new CustomerEO();</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">customer.setName("Janet2");</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">customer.setType(<strong>CustomerType.PARTNER</strong>);</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">entityManager.persist(customer);</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">在使用</span><font face="Times New Roman">@Enumerated</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">注释时，需要注意以下几个问题：</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: 20px; "><span style="line-height: 15px; font-size: 13px; font-family: Wingdings; "><font size="3">l</font><span style="line-height: normal; font-size: 7pt; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">因为枚举类型的有名称和值两个属性，所以在持久化时可以选择持久化名称或是持久化值。通过</span><font face="Times New Roman">EnumType</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">来定义，它有两个值如下所示。</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">public enum EnumType {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 21pt; "><font style="background-color: #e0e0e0; ">ORDINAL,</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 21pt; "><font style="background-color: #e0e0e0; ">STRING</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">}</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><font face="Times New Roman">ORDINAL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">表示持久化的为枚举类型的值，</span><font face="Times New Roman">STRING</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">表示持久化的为枚举类型的名称。默认为</span><font face="Times New Roman">ORDINAL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">，持久化值。例如以上示例中标注的为</span><font face="Times New Roman">STRING</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">，这样持久化实体后，数据库中保存的是枚举类型的名称，如图</span><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">所示。</span></font></p>
<p align="center" style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 12pt; margin-left: 0cm; text-indent: 20px; "><span style="line-height: 15px; font-size: 13px; font-family: 宋体; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/EJB_JPA/5.5.jpg" /></span></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">若此时改成</span><font face="Times New Roman">ORDINAL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">，代码如下：</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Enumerated(EnumType.ORDINAL)</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CustomerType getType() {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">则同样持久化的实体后，数据库保存的结果如图</span><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">所示。</span></font></p>
<p align="center" style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 12pt; margin-left: 0cm; text-indent: 20px; "><span style="line-height: 15px; font-size: 13px; font-family: 宋体; "><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/EJB_JPA/5.6.jpg" /></span></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: 20px; "><span style="line-height: 15px; font-size: 13px; font-family: Wingdings; "><font size="3">l</font><span style="line-height: normal; font-size: 7pt; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">如何选择</span><font face="Times New Roman">STRING</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">和</span><font face="Times New Roman">ORDINAL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">：</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">如果使用</span><font face="Times New Roman">STRING</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">保存，虽然从数据库中查询数据时非常直观，能够清楚的看出该类型代表意义，但这样也会带来其他的问题。若此时枚举类型的定义改变，例如上例中的枚举类型名称改为：</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public enum CustomerType {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CUST_COMPETITOR, INVESTOR, PARTNER, VENDER</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">则此时数据库中保存的&#8220;</span><font face="Times New Roman">COMPETITOR</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">&#8221;的值将不能转化为枚举类型</span><font face="Times New Roman">CustomerType</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">中的&#8220;</span><font face="Times New Roman">CUST_COMPETITOR</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">&#8221;的值。但若使用</span><font face="Times New Roman">ORDINAL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">则不会带来这种问题。所以建议使用</span><font face="Times New Roman">ORDINAL</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">类型来持久化枚举类型。</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: 20px; "><span style="line-height: 15px; font-size: 13px; font-family: Wingdings; "><font size="3">l</font><span style="line-height: normal; font-size: 7pt; font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">枚举类型的定义位置，实体外部</span><font face="Times New Roman">VS</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">实体内部。</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">上例中</span><font face="Times New Roman">CustomerType</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">枚举类型定义在</span><font face="Times New Roman">CustomerEO</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">实体内部，这是因为只有</span><font face="Times New Roman">CustomerEO</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">这个实体会使用</span><font face="Times New Roman">CustomerType</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">类型，其他的实体不会使用该类型。该类型与这个实体关系紧密联系。</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">但若此时多个实体公用一个枚举类型时，则可以将枚举类型单独定义，定义在实体的外部。有这样一个枚举类型</span><font face="Times New Roman">BusinessLine</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">，它定义在实体外部，代码如下：</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">public enum BusinessLine {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REAL_ESTATE,FINANCE, NON_PROFIT</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">}</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 21pt; "><font size="3"><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">例如</span><font face="Times New Roman">CustomerEO</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">实体增加一个</span><font face="Times New Roman">BusinessLine</font><span style="line-height: 15px; font-size: 13px; font-family: 宋体; ">的枚举类型，代码如下所示。</span></font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">@Entity</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">@Table(name = "customer")</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">public class CustomerEO implements java.io.Serializable {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 21pt; "><span style="line-height: 15px; font-size: 13px; font-family: 黑体; "><font style="background-color: #e0e0e0; ">&#8230;&#8230;</font></span></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><strong><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private BusinessLine businessLine;</font></strong></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Enumerated(EnumType.STRING)</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BusinessLine getBusinessLine() {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return businessLine;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setBusinessLine(BusinessLine businessLine) {</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.businessLine = businessLine;</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="font-size: 13px; line-height: 19px; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: auto; text-indent: 20px; "><font style="background-color: #e0e0e0; ">}</font></p>
</span>
<img src ="http://www.blogjava.net/abram/aggbug/285757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/abram/" target="_blank">chong</a> 2009-07-07 10:46 <a href="http://www.blogjava.net/abram/articles/285757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>