??xml version="1.0" encoding="utf-8" standalone="yes"?>国产在线|日韩,婷婷婷国产在线视频,中文字幕中文字幕在线中心一区http://www.aygfsteel.com/hk2000c/category/27382.html技术源于哲学,哲学来源于生z? 兛_(j)生活Q关注健P兛_(j)他h zh-cnSun, 02 Dec 2007 16:22:21 GMTSun, 02 Dec 2007 16:22:21 GMT60Hibernate 3注释?/title><link>http://www.aygfsteel.com/hk2000c/archive/2007/12/02/164573.html</link><dc:creator>hk2000c</dc:creator><author>hk2000c</author><pubDate>Sat, 01 Dec 2007 17:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/hk2000c/archive/2007/12/02/164573.html</guid><wfw:comment>http://www.aygfsteel.com/hk2000c/comments/164573.html</wfw:comment><comments>http://www.aygfsteel.com/hk2000c/archive/2007/12/02/164573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/hk2000c/comments/commentRss/164573.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/hk2000c/services/trackbacks/164573.html</trackback:ping><description><![CDATA[<p>  在过dq里QHibernate不断发展Q几乎成为Java数据库持久性的事实标准。它非常强大、灵z,而且具备?jin)优异的性能。在本文中,我们了(jin)解如何用Java 5 注释来简化Hibernate代码Qƈ使持久层的编码过E变得更松?/p> <p>  传统上,Hibernate的配|依赖于外部 XML 文gQ数据库映射被定义ؓ(f)一l?XML 映射文gQƈ且在启动时进行加载。创些映有很多Ҏ(gu)Q可以从已有数据库模式或JavacL型中自动创徏Q也可以手工创徏。无论如何,(zhn)最l将获得大量?Hibernate 映射文g。此外,q可以用工P通过javadoc样式的注释生成映文Ӟ管q样?x)给?zhn)的构徏q程增加一个步骤?/p> <p>  在最q发布的几个Hibernate版本中,出现?jin)一U基?Java 5 注释的更为y妙的新方法。借助新的 Hibernate Annotation 库,卛_一ơ性地分配所有旧映射文g——一切都?x)按照(zhn)的想法来定义——注释直接嵌入到(zhn)的 Java cMQƈ提供一U强大及(qing)灉|的方法来声明持久性映。籍p动代码完成和语法H出昄功能Q最q发布的Java IDE也ؓ(f)其提供了(jin)有力的支持?/p> <p>  Hibernate Annotationq支持新?EJB 3 持久性规范。这些规范旨在提供一U标准化?Java 持久性机制。由?Hibernate 3 q提供了(jin)一些扩展,因此(zhn)可以十分轻村֜遵从q些标准Qƈ使用 EJB 3 ~程模型来对 Hibernate 持久层进行编码?/p> <p>  现在Q让我们来动手用Hibernate Annotation?/p> <h3>安装 Hibernate Annotation</h3> <p>  要?Hibernate AnnotationQ?zhn)臛_需要具?Hibernate 3.2和Java 5。可以从 <a target="_blank">Hibernate 站点</a> 下蝲 Hibernate 3.2 ?Hibernate Annotation库。除?jin)标准?Hibernate JAR 和依赖项之外Q?zhn)q需?Hibernate Annotations .jar 文gQ?em>hibernate-annotations.jar</em>Q、Java 持久?API Q?em>lib/ejb3-persistence.jar</em>Q。如果?zhn)正在使?MavenQ只需要向 POM 文gd相应的依赖项卛_Q如下所C:(x)</p> <pre class="code"> ... <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.2.1.ga</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-annotations</artifactId> <version>3.2.0.ga</version> </dependency> <dependency> <groupId>javax.persistence</groupId> <artifactId>persistence-api</artifactId> <version>1.0</version> </dependency> ... </pre> <p>  下一步就是获?Hibernate ?x)话工厂。尽无需惊天的修改,但这一工作与?Hibernate Annotations有所不同。?zhn)需要?AnnotationConfiguration cL建立?x)话工厂Q?/p> <pre class="code">sessionFactory = new<br /> AnnotationConfiguration().buildSessionFactory(); </pre> <p>  管通常使用 <mapping> 元素来声明持久性类Q?zhn)q是需要在 Hibernate 配置文gQ通常?hibernate.cfg.xmlQ中声明持久性类Q?/p> <pre class="code"><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <mapping class="com.onjava.modelplanes.domain.PlaneType"/> <mapping class="com.onjava.modelplanes.domain.ModelPlane"/> </session-factory> </hibernate-configuration> </pre> <p>  q期的许?Java 目都用了(jin)轻量U的应用框架Q例?Spring。如果?zhn)正在使?Spring 框架Q可以?AnnotationSessionFactoryBean c轻村־立一个基于注释的 Hibernate ?x)话工厂Q如下所C:(x)</p> <pre class="coce"><!-- Hibernate session factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> ... </props> </property> <property name="annotatedClasses"> <list> <value>com.onjava.modelplanes.domain.PlaneType</value> <value>com.onjava.modelplanes.domain.ModelPlane</value> ... </list> </property> </bean> </pre> <h3>W一个持久性类</h3> <p>  既然已经知道?jin)如何获得注释所支持?Hibernate ?x)话Q下面让我们来了(jin)解一下带注释的持久性类的情况:(x)</p> <p>  像在其他M Hibernate应用E序中一P带注释的持久性类也是普?POJO。差不多可以说是。?zhn)需要向 Java 持久?API Q?em>javax.persistence.*</em>Q添加依赖项Q如果?zhn)正在使用M特定?Hibernate的扩展,那很可能是 Hibernate Annotation E序包(<em>org.hibernate.annotations.*</em>Q,但除此之外,它们只是具备?jin)持久性注释的普?POJO 。下面是一个简单的例子Q?/p> <pre class="code">@Entity public class ModelPlane { private Long id; private String name; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } </pre> <p>  正像我们所提到的,q非常简单。@Entity 注释声明该类为持久类。@Id 注释可以表明哪种属性是该类中的独特标识W。事实上Q?zhn)既可以保持字D(注释成员变量Q,也可以保持属性(注释getterҎ(gu)Q的持久性。后文中用基于属性的注释。基于注释的持久性的优点之一在于大量使用?jin)默认|最大的优点是 “惯例优先原则Qconvention over configurationQ?#8221;Q。例如,(zhn)无需说明每个属性的持久性——Q何属性都被假定ؓ(f)持久的,除非(zhn)?@Transient 注释来说明其他情c(din)这化了(jin)代码Q相对用老的 XML 映射文g而言也大q地减少?jin)输入工作量?/p> <h3>生成主键</h3> <p>  Hibernate 能够地自动生成主键。Hibernate/EBJ 3 注释也可以ؓ(f)主键的自动生成提供丰富的支持Q允许实现各U策略。下面的CZ说明?jin)一U常用的Ҏ(gu)Q其?Hibernate 会(x)Ҏ(gu)底层数据库来定一U恰当的键生成策略:(x)</p> <pre class="code">@Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { return id; } </pre> <h3>定制表和字段映射</h3> <p>  默认情况下,Hibernate ?x)将持久cM匚w的名U映到表和字段中。例如,前一个类可以与映到以如下代码创建的表中Q?/p> <pre class="code">CREATE TABLE MODELPLANE ( ID long, NAME varchar ) </pre> <p>  如果(zhn)是自己生成q维护数据库Q那么这U方法很有效Q通过省略代码可以大大化代码维护。然而,qƈ不能满所有h的需求。有些应用程序需要访问外部数据库Q而另一些可能需要遵从公司的数据库命名惯例。如果有必要Q?zhn)可以使?@Table ?@Column 注释来定制?zhn)自己的持久性映,如下所C:(x)</p> <pre class="code">@Entity @Table(name="T_MODEL_PLANE") public class ModelPlane { private Long id; private String name; @Id @Column(name="PLANE_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="PLANE_NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } } </pre> <p>  该内容将映射C表中Q?/p> <pre class="code">CREATE TABLE T_MODEL_PLANE ( PLANE_ID long, PLANE_NAME varchar ) </pre> <p>  也可以用其他图和列的属性来定制映射。这使?zhn)可以指定诸如列长度、非I约束等详细内容。Hibernate支持大量针对q些注释的属性。下例中包含了(jin)几种属性:(x)</p> <pre class="code"> ... @Column(name="PLANE_ID", length=80, nullable=true) public String getName() { return name; } ... </pre> <h3>映射关系</h3> <p>  Java 持久性映过E中最重要和最复杂的一环就是确定如何映表间的关系。像其他产品一P Hibernate 在该领域中提供了(jin)高度的灵zL,但却是以复杂度的增加Z仗我们将通过研究几个常见案例来了(jin)解如何用注释来处理q一问题?/p> <p>  其中一U最常用的关pd是多对一的关pR假定在以上CZ中每?ModelPlane 通过多对一的关p(也就是说Q每个飞机模型只与一U飞机类型徏立联p,管指定的飞机类型可以与七种飞机模型建立联系Q来?PlaneType 建立联系。可如下q行映射Q?/p> <pre class="code"> @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) public PlaneType getPlaneType() { return planeType; } </pre> <p>  CascadeType D?Hibernate 应如何处理联操作?/p> <p>  另一U常用的关系与上q关pȝ反:(x)一对多再对一关系Q也UCؓ(f)集合。在老式?Hibernate 版本中进行映或使用注释Ӟ集合令h头疼Q这里我们将要加以探讨,以(zhn)了(jin)解如何处理集合,例如Q在以上CZ中每?PlaneType 对象都可能会(x)包含一?ModelPlanes 集合。可映射如下Q?/p> <pre class="code"> @OneToMany(mappedBy="planeType", cascade=CascadeType.ALL, fetch=FetchType.EAGER) @OrderBy("name") public List<ModelPlane> getModelPlanes() { return modelPlanes; } </pre> <h3>命名查询</h3> <p>  Hibernate 最优秀的功能之一在于它能够在?zhn)的映文件中声明命名查询。随后即可通过代码中的名称调用此类查询Q这使?zhn)可以专注于查询,而避免了(jin) SQL 或?HQL 代码分散于整个应用程序中的情c(din)?/p> <p>  也可以用注释来实现命名查询Q可以?@NamedQueries ?@NamedQuery 注释Q如下所C:(x)</p> <pre class="code">@NamedQueries( { @NamedQuery( name="planeType.findById", query="select p from PlaneType p left join fetch p.modelPlanes where id=:id" ), @NamedQuery( name="planeType.findAll", query="select p from PlaneType p" ), @NamedQuery( name="planeType.delete", query="delete from PlaneType where id=:id" ) } ) </pre> <p>  一旦完成了(jin)定义Q?zhn)可以像调用其他M其他命名查询一h调用它们?/p> <h3>l束?/h3> <p>  Hibernate 3 注释提供?jin)强大而精致的 APIQ简化了(jin) Java 数据库中的持久性代码,本文中只q行?jin)简单的讨论。?zhn)可以选择遵从标准q?Java 持久?APIQ也可以利用特定?Hibernate的扩展,q些功能以损失可UL性ؓ(f)代h(hun)提供?jin)更为强大的功能和更高的灉|性。无论如何,通过消除?XML 映射文g的需求,Hibernate 注释简化应用程序的l护Q同时也可以使?zhn)对EJB 3 有初步认识。来试试吧!</p> <img src ="http://www.aygfsteel.com/hk2000c/aggbug/164573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/hk2000c/" target="_blank">hk2000c</a> 2007-12-02 01:13 <a href="http://www.aygfsteel.com/hk2000c/archive/2007/12/02/164573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʡ</a>| <a href="http://" target="_blank">ƶ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¤</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϸ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͭ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank">ȳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ī</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>