菜鸟之jpa三

本文深入探讨了JPA实体继承的映射策略及其应用,包括SINGLE_TABLE、JOINED和TABLE_PER_CLASS三种策略,并详细介绍了如何通过@DiscriminatorColumn、@DiscriminatorValue、@OneToMany和@ManyToOne注解实现继承实体间的关联关系。同时,文章还展示了如何在PollTopic实体中使用继承和关联关系,以及PollOption实体与其父类PollTopic的双向关联关系。

jpa简介

3、实体映射

3.2.2继承关系

Topic和PollTopic是父子类,JPA 采用多种方法来支持实体继承。在父类中必须声明继承实体的映射策略,如代码所

示:

代码:继承实体的映射策略

@Entity(name = "T_TOPIC")

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) ①

@DiscriminatorColumn(name = "TOPIC_TYPE",

discriminatorType = DiscriminatorType.INTEGER, length = 1) ②

@DiscriminatorValue(value="1")③

public class Topic implements Serializable ...{


}



对于继承的实体,在javax.persistence.InheritanceType定义了3种映射策略:

SINGLE_TABLE:父子类都保存到同一个表中,通过字段值进行区分。这是我们Topic实体所采用的策略,Topic和

PollTopic都保存到同一张表中,通过TOPIC_TYPE字段进行区分,Topic在T_TOPIC表中对应TOPIC_TYPE= 1的记

录,而PollTopic对应TOPIC_TYPE=2的记录(稍后在PollTopic实体中指定);区别的字段通@DiscriminatorColumn

说明,如②所示,区分字段对应该实体的值通过@DiscriminatorValue指定,如③所示;JOINED:父子类相同的部分

保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;TABLE_PER_CLASS:每一个类对应自己的

表,一般不推荐采用这种方式。

关联关系

我们再继续对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指定一对一和多以多的关系,方法

差不多,不再赘述。

今天就写到这里


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值