JPA注解指南

PA注解持久化类很方便,需要jar包:ejb3-persistence.jar。我用以下三个类来说明用法。

 1 @SuppressWarnings("serial")
 2 @Entity
 3 @Table(name="T_X")
 4 public class X implements Serializable
 5 {
 6     @Id
 7     @GeneratedValue(strategy = GenerationType.AUTO)
 8     private int id;
 9
10     @Column(length=32)
11     private String name;
12
13          @Transient   //表示此数据不在数据库表里建立属性
14          private String temp;
15
16     @Temporal(TemporalType.TIMESTAMP) //这个是带时分秒的类型
17     private Date date;
18
19     @OneToOne(cascade = CascadeType.ALL, mappedBy = "x")
20     private A a;
21 }
22 @SuppressWarnings("serial")
23 @Entity
24 @Table(name="T_A")
25 public class A implements Serializable
26 {
27     @Id
28     @GeneratedValue(strategy = GenerationType.AUTO)
29     private int id;
30
31     @OneToMany(cascade = CascadeType.ALL, mappedBy = "a", fetch = FetchType.EAGER)
32     private List<B> b = new ArrayList<B>();
33
34     @OneToOne()
35     @JoinColumn(name = "x_Id") //加这句后就会双方共同维护关系
36     private X x;
37 }
38
39 @SuppressWarnings("serial")
40 @Entity
41 public class B implements Serializable{
42          @Id
43     @GeneratedValue(strategy = GenerationType.AUTO)
44     protected int id;
45
46     @ManyToOne()
47     @JoinColumn(name = "a_id")
48     protected A a;
49 }  

要注意的是:fetch = FetchType.EAGER这句话在一个类里面只能出现一次,出现两次就会报错“cannot simultaneously fetch multiple bags”,要把其他的改为fetch = FetchType.LAZY延迟加载就可以了。听说把List集合改为Set也能解决这个错误。

其他要点: 
1、@Table(name="T_X")这句话可以不写,不写就已类名作为表名

2、如果想让两个类的属性生成一个数据表,在一个类里这样加入另一个类即可: @Embedded 
private C c;

3、如果想要一个类继承另一个类的所有属性,则在父类里这样写: 
@SuppressWarnings("serial") 
@Entity 
@MappedSuperclass   //增加这一行 
并把父类的所有属性的private改为protected即可

4、建议在一对多关联中在"一"方用延迟加载"多"方可以在HQL中显式的"迫切左外连接" left join fetch 这样做Hibernate可以少访问数据库,也可以用"@BatchSize(size = 5)"来减少访问数据库的次数

1. @Id 声明属性为主键

2. @GeneratedValue表示主键是自动生成策略,一般该注释和 @Id 一起使用

3. @Entity 任何 hibernte 映射对象都要有次注释

4. @Table(name = “tablename”) 类声明此对象映射到哪个表

5. @Column(name = “Name”,nullable=false,length=32) 声明数据 库字段和类属性对应关系

6. @Lob 声明字段为 Clob 或 Blob 类型

7. @OneToMany(mappedBy=”order”,cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
   @OrderBy(value = “id ASC”) 
   一对多声明,和 ORM 产品声明类似,一看就明白了。 
   @ManyToOne(cascade=CascadeType.REFRESH,optional=false) 
   @JoinColumn(name = “order_id”) 
   声明为双向关联

8. @Temporal(value=TemporalType.DATE) 做日期类型转换。

9. @OneToOne(optional= true,cascade = CascadeType.ALL, mappedBy = “person”) 
   一对一关联声明 
   @OneToOne(optional = false, cascade = CascadeType.REFRESH) 
   @JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true) 
   声明为双向关联

10. @ManyToMany(mappedBy= “students”) 
   多对多关联声明。 
  @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY) 
  @JoinTable(name = “Teacher_Student”, 
    joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName = “teacherid”)}, 
    inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName = 
    “studentid”)}) 
   多对多关联一般都有个关联表,是这样声明的!

11. @Transiten表示此属性与表没有映射关系,是一个暂时的属性

12. @Cache(usage= CacheConcurrencyStrategy.READ_WRITE)表示此对象应用缓存

JPA规范 
@Entity:通过@Entity注解将一个类声明为一个实体bean

@Table:通过 @Table注解可以为实体bean映射指定表,name属性表示实体所对应表的名称,如果没有定义 @Table,那么系统自动使用默认值:实体的类名(不带包名)

@Id:用于标记属性的主键

@Column:表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略@Column注解,另外有两种方式标记,一是放在属性前,另一种是放在getter方法前,例如:

@Column(name = "EMPLOYEE_NAME")

private String employee_name; 或者

@Column(name = "EMPLOYEE_NAME")

public String getEmployee_name() {

return employee_name;

} 这两种方式都是正解的,根据个人喜好来选择。大象偏向于第二种,并且喜欢将属性名与字段名设成一样的,这样可以省掉@Column注解,使代码更简洁。

@Temporal(TemporalType.DATE):如果属性是时间类型,因为数据表对时间类型有更严格的划分,所以必须指定具体时间类型,如④所示。在javax.persistence.TemporalType枚举中定义了3种时间类型:

通过 @Temporal 定义映射到数据库的时间精度: 
@Temporal(TemporalType.DATE)       日期 
@Temporal(TemporalType.TIME)       时间 
@Temporal(TemporalType.TIMESTAMP) 两者兼具

@Temporal只是起映射作为

@Transient

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface Transient {}

指明一个属性或方法不能持久化

@TableGenerator:表生成器,将当前主键的值单独保存到一个数据库表中,主键的值每次都是从指定的表中查询来获得,这种生成主键的方式是很常用的。这种方法生成主键的策略可以适用于任何数据库,不必担心不同数据库不兼容造成的问题。大象推荐这种方式管理主键,很方便,集中式管理表的主键,而且更换数据库不会造成很大的问题。各属性含义如下:

name:表示该表主键生成策略的名称,这个名字可以自定义,它被引用在@GeneratedValue中设置的"generator"值中

table:表示表生成策略所持久化的表名,说简单点就是一个管理其它表主键的表,本例中,这个表名为GENERATOR_TABLE

pkColumnName:表生成器中的列名,用来存放其它表的主键键名,这个列名是与表中的字段对应的

pkColumnValue:实体表所对应到生成器表中的主键名,这个键名是可以自定义滴

valueColumnName:表生成器中的列名,实体表主键的下一个值,假设EMPLOYEE表中的EMPLOYEE_ID最大为2,那么此时,生成器表中与实体表主键对应的键名值则为3

allocationSize:表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface OneToMany {

String targetEntity() default "";

CascadeType[] cascade() default {};

FetchType fetch() default LAZY;

String mappedBy() default "";

}

String targetEntity (Optional) The fully qualified class name of

the entity class that is the target of the association.

Optional only if the Collection property

is defined using Java generics. Must be

specified otherwise.

The parameter type of the

Collection when defined

using generics(Generics泛型),    如果使用泛型,就可省略指明targetEntity

CascadeType[] cascade (Optional) The operations that should be cascaded

to the target of the association

No operations are cascaded

FetchType fetch (Optional) Whether the association should be

lazy loaded or eagerly fetched.

FetchType.LAZY    默认为延迟加载

String mappedBy (Optional) The field that owns the relationship

指多的一方关联的属性名

mappedBy指定的是不需要维护关系的一端  ??

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface ManyToOne {

String targetEntity() default "";

CascadeType[] cascade() default {};

FetchType fetch() default EAGER;

boolean optional() default true;

}

targetEntity (Optional) The fully qualified class name of the entity class that is the target of the associationThe type of the property that stores the association

是指一方的实体类型的class  ,默认的就是这个属性的类型。其实有些可以省略掉

CascadeType[] cascade (Optional) The operations that should be cascaded

to the target of the association No operations are cascaded

FetchType fetch (Optional) Whether the association should be

lazy loaded or eagerly fetched.      FetchType.EAGER   默认为主动加载

boolean optional (Optional) Whether the association is optional.

If set to false then a non-null relationship must  always exist.

true

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface OneToOne {

String targetEntity() default "";

CascadeType[] cascade() default {};

FetchType fetch() default EAGER;

boolean optional() default true;

String mappedBy() default "";

boolean usePKasFK() default false;

}

The JoinColumn annotation is used to specify a mapped column for joining an entity association or a

secondary table.

@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)

public @interface JoinColumn {

String name() default "";

String referencedColumnName() default "";

boolean primaryKey() default false;

boolean unique() default false;

boolean nullable() default true;

boolean insertable() default true;

boolean updatable() default true;

String columnDefinition() default "";

String secondaryTable() default "";

}

@Target({METHOD, FIELD}) @Retention(RUNTIME)

public @interface ManyToMany {

String targetEntity() default "";

CascadeType[] cascade() default {};

FetchType fetch() default LAZY;

String mappedBy() default "";

}

时间: 2025-01-05 01:57:38

JPA注解指南的相关文章

Java、Hibernate(JPA)注解大全

1.@Entity(name=”EntityName”) 必须,name为可选,对应数据库中一的个表 2.@Table(name=””,catalog=””,schema=””) 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 catalog:可选,表示Catalog名称,默认为Catalog(“”). schema:可选,表示Schema名称,默认为

Lombok注解指南

Lombok注解指南 @Data :注解在类上:提供类所有属性的 getting 和 setting 方法,此外还提供了equals.canEqual.hashCode.toString 方法 @Setter:注解在属性上:为属性提供 setting 方法 @Getter:注解在属性上:为属性提供 getting 方法 @Log4j :注解在类上:为类提供一个 属性名为log 的 log4j 日志对象 @NoArgsConstructor:注解在类上:为类提供一个无参的构造方法 @AllArgs

JPA注解实现联合主键

当表中一个主键不能唯一标识一条记录的时候,就需要使用联合主键了,下面是使用JPA注解实现联合主键的代码 1 首先需要建立一个复合主键类,用来存放需要生产联合主键的属性,该类需要实现序列化. package com.ericsson.adp.entity.cons; import java.io.Serializable; public class ConsumerGroupMapPK implements Serializable{ private String msisdn;//电话号码 pr

JPA注解catalog

Table Table用来定义entity主表的name,catalog,schema等属性. 元数据属性说明: name: 表名catalog: 对应关系数据库中的catalog,如果在entitybean中设置此属性,将在表名前面加上catalog指定的值,注意catalog的值一定是数据库的名称,不然会生成的sql语句回报找不到表的错误.schema:对应关系数据库中的schemaUniqueConstraints:定义一个UniqueConstraint数组,指定需要建唯一约束的列   

jpa 注解使用说明

1.@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 2.@Table(name="",catalog="",schema="") 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息;name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 catalog:可选,表示Catalog名称,默认为Ca

JPA学习笔记(3)——JPA注解

Entity Table Id GeneratedValue Basic Column Transient Temporal @Entity @Entity 标注用于实体类声明语句之前.指出该Java 类为实体类,将映射到指定的数据库表. @Table 当实体类与其映射的数据库表名不同名时须要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行.也可与声明语句同行. @Table 标注的经常使用选项是 name.用于指明数据库的表名 @T

hibernate自带的注解和jpa注解的冠希

hibernate是实现了JPA规范,在我们使用hibernate框架的时候,我们引入了hibernate3或者4这个核心包.hibernate-jpa-2.0-api-1.0.0.Final.jar这个包的作用是hibernate jpa实现. 注解的选择,建议采用hibernate jpa,为什么呢,如果你要把你的代码移植到其他框架,比如EJB中,那么你可以不修改任何一句代码,就能实现很好的移植.至于hibernate 的table可能会出现莫名其妙的错误,所以基本上都采用hibernate

ssh搭建过程加入jpa+注解(简化代码量)

搭建的过程: 一:第一步是:导包. Struts2+hibernate+spring 的jar包和MySQL的jar包.                          二:第二步是编写web.xml的文件,配置Struts和spring的属性的信息.在web.xml的文件中 1:这个是web.xml文件中Struts的配置信息. 2:这个是spring在web.xml的配置的信息: 三:第三步是编写pojo的类的实体类. 1:编写实体类: 2:之后就编写×××.hbm.xml的文件. 四:第

理解JPA注解@GeneratedValue的使用方法

https://blog.csdn.net/u012838207/article/details/80406716 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出. ? 1 2 3 4 5 6 Target