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