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)单向外键:

(2)双向外键:

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

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

2、1 to N , N to 1

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

(1)多对一单向

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

(3)双向(应用少)

3、N to N

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

(1)单向

(2)双向(应用少)

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

六、

@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;

  }

05-28 23:40