频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

JPA重整ORM山河

来源:IT168 作者:它山 出处:巧巧读书 2007-10-05 进入讨论组
上一页 1 2 3 4 5 6 7 下一页 

讨论组http://group.qqread.com

关联关系 

我们再继续对PollTopic进行注解,进一步了解实体继承的JPA映射定义: 

代码清单3:PollTopic映射描述

package com.baobaotao.domain;



@Entity

@DiscriminatorValue(value="2") ①

public class PollTopic extends Topic ...{②继承于Topic实体

private boolean multiple; ③

@Column(name = "MAX_CHOICES")

private int maxChoices;

@OneToMany(mappedBy="pollTopic",cascade=CascadeType.ALL) ④

private Set options = new HashSet();

//省略get/setter方法

}

在①处,通过@DiscriminatorValue将区分字段TOPIC_TYPE的值为2。由于PollTopic实体继承于Topic实体,其它的元数据信息直接从Topic获得。 

JPA规范规定任何属性都默认映射到表中,所以虽然我们没有给③处的multiple属性提供注解信息,但JPA将按照默认的规则对该字段进行映射:字段名和属性名相同,类型相同。如果我们不希望将某个属性持久化到数据表中,则可以通过@Transient注解显式指定: 

@Transient 

private boolean tempProp1; 

在④处,我们通过@OneToMany指定了一个一对多的关联关系,一个PollTopic包括多个PollOption对象(我们将在稍后的PollOption中通过ManyToOne描述PollOption和PollTopic的关系,以建立PollTopic和PollOption的双向关联关系)。

@OneToMany中通过mappedBy属性指定“Many”方类引用“One”方类的属性名,这里mappedBy="pollTopic"表示PollOption实体拥有一个指定PollTopic的pollTopic属性。 

下面,我们来看一下Many方PollOption实体类的映射描述:

代码清单4:PollOption映射描述

package com.baobaotao.domain;



@Entity(name="T_POLL_OPTION")

public class PollOption implements Serializable ...{

@Id

@GeneratedValue(strategy = GenerationType.TABLE)

@Column(name = "OPTION_ID")

private int optionId;

@Column(name = "OPTION_ITEM")

private String optionItem;

@ManyToOne  ①

@JoinColumn(name="TOPIC_ID", nullable=false) ②

private PollTopic pollTopic;

}

在①处通过@ManyToOne描述了PollOption和PollTopic的多对一关联关系,并通过@JoinColumn指定关联PollTopic实体所对应表的“外键”,如②所示。 

当然也可以通过@OneToOne和@ManyToMany指定一对一和多以多的关系,方法差不多,不再赘述。

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 

进入讨论组讨论。
上一页 1 2 3 4 5 6 7 下一页 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章