JPA之Entity注解说明

1、基本注解:  
例子:
@Entity(name = "T_TOPIC")  ①
public class Topic implements Serializable ...{
@Id  ② -1
@GeneratedValue(strategy = GenerationType.TABLE)  ② -2

@Column(name = "TOPIC_ID")  ② -3
private int topicId;

@Column(name = "TOPIC_TITLE", length = 100)  ③
private String topicTitle;

@Column(name = "TOPIC_TIME")
@Temporal(TemporalType.DATE)  ④
private Date topicTime;

@Column(name = "TOPIC_VIEWS")
private int topicViews;

...

}

解释:
① Entity 标明该类 (Topic) 为一个实体类,它对应数据库中的表表名是 T_TOPIC ,这里也可以写成: @Entity
@Table(name = "T_TOPIC") 其作用都是一样的

② -1 Id 标明该属性对应数据表中的主键
② -2 GeneratedValue 通过 strategy 属性指明主键生成策略,默认情况下, JPA 自动选择一个最适合底层数据库的主键生成策略。
在 javax.persistence.GenerationType 中定义了以下几种可供选择的策略:
1) IDENTITY :表自增键字段, Oracle 不支持这种方式;
2) AUTO : JPA 自动选择合适的策略,是默认选项;
3) SEQUENCE :通过序列产生主键,通过 @SequenceGenerator 注解指定序列名, MySql 不支持这种方式;
4) TABLE :通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
② -3 Column 标明这个属性是数据表中的一列,该列的名字是 TOPIC_ID

③ Column 的一个属性 length 指明的是该属性的允许的长度。 ( 个人认为设定该属性只是对于程序中操作该属性时增加了一验证过程,
对数据库中该列原来的设置并没有影响,但是 length 属性指定的值必须不能大于数据库创建表时给该列限制的最大长度否则会出错 )

④ Temporal(TemporalType.DATE) :如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型。
在 javax.persistence.TemporalType 枚举中定义了 3 种时间类型:
1) DATE :等于 java.sql.Date
2) TIME :等于 java.sql.Time
3) TIMESTAMP :等于 java.sql.Timestamp


2、继承关系:

对继承关系进行注解,必须在 父类 中声明继承实体的映射策略。
例子:
@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 ...{ … }

解释:
① Inheritance 通过 strategy 属性指明实体的继承策略。
在 javax.persistence.InheritanceType 定义了 3 种映射策略:
1) SINGLE_TABLE :父子类都保存到同一个表中,通过字段值进行区分。
2) JOINED :父子类相同的部分保存在同一个表中,不同的部分分开存放,通过表连接获取完整数据;
3) TABLE_PER_CLASS :每一个类对应自己的表,一般不推荐采用这种方式。

② DiscriminatorColumn 如果继承策略采用第一种继承策略,则需要指明区分父子类的字段, DiscriminatorColumn 就是用来指明区分字段的注解。

③ DiscriminatorValue 同样的采用第一种继承策略通过字段区分父子类,则用这个注解给该实体的区分字段赋值在这里赋的值为 ”1”.

3、关联关系:
例子:
@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 获得。
④ OneToMany 指定了一个一对多的关联关系, mappedBy 属性指定 “Many” 方类引用 “One” 方类 的属性名; 
cascade 属性指明了级联方式(如果这里不指定为 CascadeType.ALL 的话,那么有关联关系的两个对象在做保存和删除操作时要分别来进行) 
建议 :尽可能使用 cascade=CascadeType.ALL 来减少持久化操作的复杂性和代码量
注意 : JPA 规范规定任何属性都默认映射到表中,所以虽然我们没有给③处的 multiple 属性提供注解信息,但 JPA 将按照默认的规则对该字段进行映射:
字段名和属性名相同,类型相同。如果我们不希望将某个属性持久化到数据表中,则可以通过 @Transient 注解显式指定:
@Transient
private boolean tempProp1;

@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 描述了多对一的关联关系,他是对该类引用的 ”One” 类 (PollTopic) 的属性( pollTopic )进行注解的。
② JoinColumn 指定关联 ”One”(PollTopic) 实体所对应表的 “ 外键 ” 。

4、二进制blob/clob大字段
在 JPA 中 Lob 类型类型的持久化很简单,仅需要通过特殊的 Lob 注解就可以达到目的。
例子:

@Lob  ① -1
@Basic(fetch = FetchType.EAGER)  ① -2
@Column(name = "POST_TEXT", columnDefinition = "LONGTEXT NOT NULL")  ① -3

private String postText;
@Lob
@Basic(fetch = FetchType. LAZY)  ② -2
@Column(name = "POST_ATTACH", columnDefinition = "BLOB")  ② -3
private byte[] postAttach;

解释:
① -1 JPA 通过 @Lob 将属性标注为 Lob 类型 ;
① -2 通过 @Basic 指定 Lob 类型数据的获取策略, FetchType.EAGER 表示非延迟 加载,而 FetchType. LAZY 表示延迟加载 ;
① -3 通过 @Column 的 columnDefinition 属性指定数据表对应的 Lob 字段类型。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值