JPA的常用Annotation

http://www.blogjava.net/zJun/archive/2007/01/24/95747.html

 @transient 忽略该方法

一、

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

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

二、

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

@GeneratedValue(默认取值anto,ID生成策略)

三、

@Column(name=”wifeid”):表示持久化属性所映射表中的字段,如果属性名与表中的字段名相同,则可以省略

四、联合主键

  当entity class使用复合主键时,需要定义一个类作为id class。id class必须符合以下要求:类必须声明为public,并提供一个声明为public的空构造函数。必须实现Serializable接,覆写 equals()和hashCode()方法。entity class的所有id field在id class都要定义,且类型一样。

在类名上@Entity@IdClass(TeacherPK.class)

在联合主键的两个属性上分别@Id@Id

   public class EmployeePK implements java.io.Serializable{
       String empName;
       Integer empAge;
       public EmployeePK(){}
       public boolean equals(Object obj){ ......}
       public int hashCode(){......}
    }

    @IdClass(EmployeePK.class)
    @Entity
    public class Employee {
        @Id String empName;
        @Id Integer empAge;
    }

五、关联关系(在getter方法上加入以下Annotation)

1、1 to 1

(1)单向外键:

Husband中:

private Wife wife;

@OneToOne

@JoinColumn(name="wifeid")-->设置Husband表中的对应字段名,可以省略,默认字段名为类名_主键名

(2)双向外键:

Husband中:

private Wife wife;

@OneToOne

@JoinColumn(name="wifeid")-->设置Husband表中的对应字段名,可以省略,默认字段名为类名_主键名

Wife中:

private Husband husband;

@OneToOne(mappedBy="wife")-->wife为Husband类中的属性

(3)联合主键:(wife类中的id和name作为联合主键)

Husband中:

private Wife wife;

@OneToOne

@JoinColumns({     -->设置Husband表中的对应字段名,可以省略,默认字段名为类名_主键名

         @JoinColumn(name="wifeid", referencedColumnName="id"),

                @JoinColumn(name="wifename", referencedColumnName="name")

        })

(4)组件映射:(Wife作为Husband的一部分,两个类一张表)

Husband中:

private Wife wife;

@Embedded

@Column-->可略

Wife中:

不需要@Entity@Id

2、1 to N , N to 1

设计:在“多”方加入外键,而不是在“一”方加入外键。下面三种方式生成的表是一样的。

(1)多对一单向

User中:

private Group group;

@ManyToOne

@JoinColumn-->可略

(2)一对多单向(在多方的表中加入外键)

Group中:

private User<Set> users = new HashSet<User>();

@OneToMany

@JoinColumn(name="groupid")-->避免产生中间表

(3)双向(应用少)

User中:

private Group group;

@ManyToOne

@JoinColumn-->可略

Group中:

private User<Set> users = new HashSet<User>();

@OneToMany(mappedBy="group")-->User类中的group属性

3、N to N

设计:加入中间表。下面两种方式生成的表一样。

(1)单向

Teacher中:

private Set<Student> students = new HashSet<Student>();

@ManyToMany

@JoinTable(          -->修改中间表名及字段名

       name=”teacher_student”,

         joinColumns=@JoinColumn(name="t_ID", referencedColumnName="id"),

       inverseJoinColumns=@JoinColumn(name="s_ID", referencedColumnName="id")

       )

(2)双向(应用少)

Teacher中同上;

Student中:

private Set<Teacher> teachers = new HashSet<Teacher>();

@ManyToMany(mappedBy="students")

4、在@OneToOne@OneToMany@ManyToOne@ManyToMany后面的括号中可以加入两个属性:

cascade=CascadeType.ALL-->增删改数据时

fetch=FetchType.LAZY/EARGER-->读数据时

六、 

@JoinColumn

如果在entity class的field上定义了关系(one2one或one2many等),我们通过JoinColumn来定义关系的属性。

name:列名。

referencedColumnName:该列指向列的列名(建表时该列作为外键列指向关系另一端的指定列)

unique: 是否唯一

nullable: 是否允许为空

insertable: 是否允许插入

updatable: 是否允许更新

columnDefinition: 定义建表时创建此列的DDL

secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字。

下面的代码说明Husband和Wife是一对一关系。在Husband对应的映射表建一个名为wifeid的列,该列作为外键指向Wife对应表中的主键id。

public class Husband{

         private Wife wife;

    @OneToOne

         @JoinColumn(name="wifeid")

         public Wife getWife () {

                   return wife;

         }

 7、

@JoinColumns

如果在entity class的field上定义了关系(one2one或one2many等),并且关系存在多个JoinColumn,用JoinColumns定义多个JoinColumn的属性。

元数据属性说明:

value: 定义JoinColumn数组,指定每个JoinColumn的属性。

下面的代码说明Husband和Wife是一对一关系。在Husband对应的映射表建两列,一个名为wifeid的列,该列作为外键指向Wife对应表中的主键id;另一个为wifename的列,该列作为外键指向Wife对应表中的主键name。

public class Husband{

         private Wife wife;

@OneToOne

         @JoinColumns({

             @JoinColumn(name="wifeid", referencedColumnName="id"),

             @JoinColumn(name="wifename", referencedColumnName="name")

         })

         public Wife getWife () {

                   return wife;

         }

 8、

@JoinTable

JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTable,使用JoinTable的默认值。

元数据属性说明:

  • name:这个join table的名字。
  • joinColumns:定义指向所有者主表的外键列,数据类型是JoinColumn数组。
  • inverseJoinColumns:定义指向非所有者主表的外键列,数据类型是JoinColumn数组。

下面的teacher类代码定义了一个连接表teacher和student的join table。join table的表名是teacher_student,包含两个外键,一个外键是t_ID,指向表teacher的主键ID,另一个外键是s_ID,指向表student的主键ID。其中referencedColumnName可以省略。

public class Teacher{

 private Set<Student> students = new HashSer<Student>();   

 @ManyToMany                                                                        

  @JoinTable(

    name=”teacher_student”,

    joinColumns=@JoinColumn(name="t_ID", referencedColumnName="id"),

    inverseJoinColumns=@JoinColumn(name="s_ID", referencedColumnName="id")

    )

  public  Set<Student> getStudents(){

    return students;

  }

   

原文地址:https://www.cnblogs.com/seven7seven/p/3865750.html