技术开发 频道

JPA重整ORM山河


IT168分析评论】 
    Lob字段 
    在JPA中Lob类型类型的持久化很简单,仅需要通过特殊的Lob注解就可以达到目的。下面,我们对Post中的Lob属性类型进行标注: 
    代码清单 5 Post:标注Lob类型属性
package com.baobaotao.domain; import javax.persistence.Basic; import javax.persistence.Lob; @Entity(name = "T_POST") public class Post implements Serializable { @Lob ①-1 @Basic(fetch = FetchType.EAGER) ①-2 @Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL") ①-3 private String postText; @Lob ②-1 @Basic(fetch = FetchType. LAZY) ②-2 @Column(name = "POST_ATTACH", columnDefinition = "BLOB") ②-3 private byte[] postAttach; }
    postText属性对应T_POST表的POST_TEXT字段,该字段的类型是LONTTEXT,并且非空。JPA通过@Lob将属性标注为Lob类型,如①-1和②-1所示。通过@Basic指定Lob类型数据的获取策略,FetchType.EAGER表示非延迟加载,而FetchType. LAZY表示延迟加载,如①-2和②-2所示。通过@Column的columnDefinition属性指定数据表对应的Lob字段类型,如①-3和②-3所示。 
    关于JPA注解的更多信息,你可以通过这篇文章进行更加深入的学习:    http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html 

    4.使用XML元数据 
    除了使用注解提供元数据信息外,JPA也允许我们通过XML提供元数据信息。条条道路通罗马,路路都是安康道,开发者安全可以根据自己的习惯喜好择一而从。按照JPA的规范,如果你提供了XML元数据描述信息,它将覆盖实体类中的注解元数据信息。XML元数据信息以orm.xml命名,放置在类路径的META-INF目录下。 
    JPA尽量让XML和注解的元数据在描述的结构上相近,降低学习曲线和转换难度,所以我们在学习注解元数据后,学习XML元数据变得非常简单。下面,我们给出以上实体的XML描述版本,你可以对照注解的描述进行比较学习: 
    代码清单 6 XML元数据配置:orm.xml
<?xml version="1.0" encoding="UTF-8"?> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd
" version="1.0"> ①实体对象所在的包 <package>com.baobaotao.domain</package> <entity class="Topic"> ②Topic实体配置 <table name="T_TOPIC" /> <attributes> <id name="topicId"> <column name="TOPIC_ID"/> <generated-value strategy="TABLE" /> </id> <basic name="topicTitle"> <column name="TOPIC_TITLE" length="30" /> </basic> <basic name="topicTime"> <column name="TOPIC_TIME" /> <temporal>DATE</temporal> </basic> <basic name="topicViews"> <column name="TOPIC_VIEWS" /> </basic> </attributes> </entity> <entity class="PollTopic"> ②PollTopic实体配置 <discriminator-value>2</discriminator-value> <attributes> <basic name="maxChoices"> <column name="MAX_CHOICES" /> </basic> <one-to-many name="options" mapped-by="pollTopic"> <cascade> <cascade-all/> </cascade> </one-to-many> </attributes> </entity> <entity class="PollOption"> ②PollOption实体配置 <table name="T_POLL_OPTION" /> <attributes> <id name="optionId"> <column name="OPTION_ID" /> <generated-value strategy="TABLE" /> </id> <basic name="optionItem"> <column name="OPTION_ITEM"/> </basic> <many-to-one name="pollTopic" > <join-column name="TOPIC_ID" nullable="false"/> </many-to-one> </attributes> </entity> <entity class="Post"> ②Post实体配置 <table name="T_POST" /> <attributes> <id name="postId"> <column name="POST_ID" /> <generated-value strategy="TABLE" /> </id> <basic name="postText" fetch="EAGER"> <column name="POST_TEXT" column-definition="LONGTEXT NOT NULL"/> <lob/> </basic> <basic name="postAttach" fetch="LAZY"> <column name="POST_ATTACH" column-definition="BLOB"/> <lob/> </basic> </attributes> </entity> </entity-mappings>
    从代码清单 6中,我们可以看出PollTopic并不需要通过特殊配置指定和Topic的继承关系,这些信息将从实体类反射信息获取。所以从严格意义上来说,元数据信息或XML和实体类结构信息共同构成的。
0
相关文章