zoukankan      html  css  js  c++  java
  • 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;

      }

       

  • 相关阅读:
    opensuse的一些软件使用
    love2d新闻
    好用的在线工具收集
    POJ2531 Network Saboteur 枚举||随机化
    Acdream Path 动态规划
    Acdream Xor 简单数学
    POJ2676 Sudoku 搜索
    Acdream 1015 Double Kings 搜索
    Acdream Multiplication 基础题
    Acdream Cut 贪心
  • 原文地址:https://www.cnblogs.com/seven7seven/p/3865750.html
Copyright © 2011-2022 走看看