hibernate的OneToOne映射详解

hibernate的OneToOne映射详解



http://www.2cto.com/kf/201604/500985.html

hibernate的OneToOne映射包括外键的单/双向映射,主键的单/双向映射,联合主键映射等。

关于OneToOne的映射,hibernate的annotation的API做了如下描述:

2.2.5.1.一对一(One-to-one)

使用@OneToOne注解可以建立实体bean之间的一对一的关联. 一对一关联有三种情况: 一是关联的实体都共享同样的主

键, 二是其中一个实体通过外键关联到另一个实体的主键 (注意要模拟一对一关联必须在外键列上添加唯一约束). 三

是通过关联表来保存两个实体之间的连接关系 (注意要模拟一对一关联必须在每一个外键上添加唯一约束).

首先,我们通过共享主键来进行一对一关联映射:

?

1 @Entity

2 public class Body {

3 @Id

4 public Long getId() { return id; }

5

6 @OneToOne(cascade = CascadeType.ALL)

7 @PrimaryKeyJoinColumn

8 public Heart getHeart() {

9 return heart;

10 }

11 …

12 }

?

1 @Entity

2 public class Heart {

3 @Id

4 public Long getId() { …}

5 }

上面的例子通过使用注解@PrimaryKeyJoinColumn定义了一对一关联.

下面这个例子使用外键列进行实体的关联.

?

1

@Entity

2

public class Customer implements Serializable {

3

@OneToOne(cascade = CascadeType.ALL)

4

 <strong>@JoinColumn(name="passport_fk")</strong>

5

 public Passport getPassport() {

6

…

7

 }

8

9

@Entity

10

public class Passport implements Serializable {

11

@OneToOne(<strong>mappedBy = “passport”

12

</strong>)

13

 public Customer getOwner() {

14

…

}

上面这个例子中,Customer通过Customer表中名为的passport_fk外键列和Passport关联.@JoinColumn注解定义了联接列

(join column). 该注解和@Column注解有点类似, 但是多了一个名为referencedColumnName的参数. 该参数定义了所关

联目标实体中的联接列. 注意,当referencedColumnName关联到非主键列的时候, 关联的目标类必须实现Serializable,

还要注意的是所映射的属性对应单个列(否则映射无效).

一对一关联可能是双向的.在双向关联中, 有且仅有一端是作为主体(owner)端存在的:主体端负责维护联接列(即更

新). 对于不需要维护这种关系的从表则通过mappedBy属性进行声明.mappedBy的值指向主体的关联属性. 在上面这个例

子中,mappedBy的值为passport. 最后,不必也不能再在被关联端(owned side)定义联接列了,因为已经在主体端进行了

声明.

如果在主体没有声明@JoinColumn, 自动进行处理: 在主表(owner table)中将创建联接列, 列名为:主体的关联属

系统

性名+下划线+被关联端的主键列名. 在上面这个例子中是passport_id, 因为Customer中关联属性名为

passport,Passport的主键是id.

The third possibility (using an association table) is very exotic.

第三种方式也许是最另类的(通过关联表).

?

1

@Entity

2

public class Customer implements Serializable {

3

@OneToOne(cascade = CascadeType.ALL)

4

 <strong>@JoinTable(name = "CustomerPassports",

5

joinColumns = @JoinColumn(name=“customer_fk”),

6

inverseJoinColumns =

7

@JoinColumn(name=“passport_fk”)</strong>

8

)

9

 public Passport getPassport() {

10

…

11

 }

12

13

@Entity

14

public class Passport implements Serializable {

15

@OneToOne(<strong>mappedBy = “passport”

16

</strong>)

17

 public Customer getOwner() {

…

}

Customer通过名为CustomerPassports的关联表和Passport关联; 该关联表拥有名为passport_fk的外键列,该 外键指向

Passport表,该信息定义为inverseJoinColumn的属性值, 而customer_fk外键列指向Customer表, 该信息定义为

joinColumns的属性值.

这种关联可能是双向的.在双向关联中, 有且仅有一端是作为主体端存在的:主体端负责维护联接列(即更新). 对于不

需要维护这种关系的从表则通过mappedBy属性进行声明.mappedBy的值指向主体的关联属性. 在上面这个例子

中,mappedBy的值为passport. 最后,不必也不能再在被关联端(owned side)定义联接列了,因为已经在主体端进行了声

明.

你必须明确定义关联表名和关联列名.

hibernate的xml方式的API则分别做了单独描述:

一.单向关联,包括外键和主键

7.2.2.One-to-one

基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯

一性约束。

?

1 <class name=“Person”>

2 <id column=“personId” name=“id”>

3 <generator class=“native”>

4 </generator></id>

5 <many-to-one column=“addressId” name=“address” not-

6 null=“true” unique=“true”>

7 </many-to-one></class>

8

9 <class name=“Address”>

10 <id column=“addressId” name=“id”>

11 <generator class=“native”>

12 </generator></id>

</class>
?

1 create table Person ( personId bigint not null primary key,

2 addressId bigint not null unique )

3 create table Address ( addressId bigint not null primary

key )

Aunidirectional one-to-one association on a primary keyusually uses a special id generator In this

example, however, we have reversed the direction of the association:

?

1

<class name="Person">

2

 <id column="personId" name="id">

3

 <generator class="native">

4

 </generator></id>

5

</class>

6

7

<class name="Address">

8

 <id column="personId" name="id">

9

 <generator class="foreign"><param

10

name=“property”>person

11

 </generator>

12

 </id>

13

 <one-to-one constrained="true" name="person">
</one-to-one></class>
?

1 create table Person ( personId bigint not null primary key

2 )

3 create table Address ( personId bigint not null primary

key )

二.使用链接表的单向关联

7.3.3.One-to-one

Aunidirectional one-to-one association on a join tableis possible, but extremely unusual.

?

1

<class name="Person">

2

 <id column="personId" name="id">

3

 <generator class="native">

4

 </generator></id>

5

 <join optional="true" table="PersonAddress">

6

 <key column="personId" unique="true">

7

 <many-to-one column="addressId" name="address" not-

8

null=“true” unique=“true”>

9

 </many-to-one></key></join>

10

</class>

11

12

<class name="Address">

13

 <id column="addressId" name="id">

14

 <generator class="native">

15

 </generator></id>
</class>
?

1 create table Person ( personId bigint not null primary key

2 )

3 create table PersonAddress ( personId bigint not null

4 primary key, addressId bigint not null unique )

create table Address ( addressId bigint not null primary

key )

三.双向关联

7.4.2.One-to-one

Abidirectional one-to-one association on a foreign keyis common:

?

1

<class name="Person">

2

 <id column="personId" name="id">

3

 <generator class="native">

4

 </generator></id>

5

 <many-to-one column="addressId" name="address" not-

6

null=“true” unique=“true”>

7

</many-to-one></class>

8

9

<class name="Address">

10

 <id column="addressId" name="id">

11

 <generator class="native">

12

 </generator></id>

13

 <one-to-one name="person" property-ref="address">
</one-to-one></class>
?

1 create table Person ( personId bigint not null primary key,

2 addressId bigint not null unique )

3 create table Address ( addressId bigint not null primary

key )

Abidirectional one-to-one association on a primary keyuses the special id generator:

?

1

<class name="Person">

2

 <id column="personId" name="id">

3

 <generator class="native">

4

 </generator></id>

5

 <one-to-one name="address">

6

</one-to-one></class>

7

8

<class name="Address">

9

 <id column="personId" name="id">

10

 <generator class="foreign"><param

11

name=“property”>person

12

 </generator>

13

 </id>

14

 <one-to-one constrained="true" name="person">
</one-to-one></class>
?

1 create table Person ( personId bigint not null primary key

2 )

3 create table Address ( personId bigint not null primary

key )

四.使用链接表的双向关联

7.5.2.一对一(one to one)

Abidirectional one-to-one association on a join tableis possible, but extremely unusual.

?

1

<class name="Person">

2

 <id column="personId" name="id">

3

 <generator class="native">

4

 </generator></id>

5

 <join optional="true" table="PersonAddress">

6

 <key column="personId" unique="true">

7

 <many-to-one column="addressId" name="address" not-

8

null=“true” unique=“true”>

9

 </many-to-one></key></join>

10

</class>

11

12

<class name="Address">

13

 <id column="addressId" name="id">

14

 <generator class="native">

15

 </generator></id>

16

 <join inverse="true" optional="true"

17

table=“PersonAddress”>

18

 <key column="addressId" unique="true">

19

 <many-to-one column="personId" name="person" not-
null="true" unique="true">
 </many-to-one></key></join>
</class>
?

1 create table Person ( personId bigint not null primary key

2 )

3 create table PersonAddress ( personId bigint not null

4 primary key, addressId bigint not null unique )

create table Address ( addressId bigint not null primary

key )

1.OneToOne的外键单向映射

先看annotation版本

本例使用Husband和Wife为例,需要在Husband里面引用Wife,并在getWife上使用

@OneToOne@JoinColumn(name=“wifeId”)

Husband类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

import javax.persistence.JoinColumn;

7

import javax.persistence.OneToOne;

8

9

@Entity

10

public class Husband {

11

 private String id;

12

 private String name;

13

 private Wife wife;

14

@Id

15

@GeneratedValue//auto

16

 public String getId() {

17

return id;

18

 }

19

 public void setId(String id) {

20

this.id = id;

21

 }

22

 public String getName() {

23

return name;

24

 }

25

 public void setName(String name) {

26

this.name = name;

27

 }

28

@OneToOne

29

@JoinColumn(name=“wifeId”)

30

 public Wife getWife() {

31

return wife;

32

 }

33

 public void setWife(Wife wife) {

34

this.wife = wife;

35

 }

36

}

Wife类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

7

@Entity

8

public class Wife {

9

 private String id;

10

 private String name;

11

@Id

12

@GeneratedValue//auto

13

 public String getId() {

14

return id;

15

 }

16

 public void setId(String id) {

17

this.id = id;

18

 }

19

 public String getName() {

20

return name;

21

 }

22

 public void setName(String name) {

23

this.name = name;

24

 }

25

}

使用JUnit进行测试

OrMappingTest类

?

1

package com.baosight.model;

2

3

import org.hibernate.SessionFactory;

4

import org.hibernate.cfg.AnnotationConfiguration;

5

import org.hibernate.cfg.Configuration;

6

import org.hibernate.tool.hbm2ddl.SchemaExport;

7

import org.junit.AfterClass;

8

import org.junit.BeforeClass;

9

import org.junit.Test;

10

11

public class OrMappingTest {

12

 private static SessionFactory sf = null;

13

@BeforeClass

14

 public static void beforeClass(){

15

// 读取配置文件

16

Configuration cfg = new AnnotationConfiguration();

17

// 得到session工厂

18

sf = cfg.configure().buildSessionFactory();

19

 }

20

@Test

21

 public void testSchemaExport() {

22

new SchemaExport(new

23

AnnotationConfiguration().configure()).create(false, true);

24

 }

25

@AfterClass

26

 public static void afterClass(){

27

// 关闭session工厂

28

sf.close();

29

 }
}

运行结果为:

笔记插图(第 8 页)

\

2.OneToOne的外键单向映射

看看xml版本

使用Student和StudentCard,.,需要在StudentCard里面引用Student,并在StudentCard.hbm.xml使用

Student类

?

1

package com.baosight.model;

2

3

4

public class Student {

5

 private String id;

6

 private String name;

7

 private int age;

8

 public String getId() {

9

return id;

10

 }

11

 public void setId(String id) {

12

this.id = id;

13

 }

14

 public String getName() {

15

return name;

16

 }

17

 public void setName(String name) {

18

this.name = name;

19

 }

20

21

 public int getAge() {

22

return age;

23

 }

24

 public void setAge(int age) {

25

this.age = age;

26

 }

27

28

}

StudentCard类

?

1

package com.baosight.model;

2

3

4

public class StudentCard {

5

 private String id;

6

 private String num;

7

 private Student student;

8

 public String getId() {

9

return id;

10

 }

11

 public void setId(String id) {

12

this.id = id;

13

 }

14

 public String getNum() {

15

return num;

16

 }

17

 public void setNum(String num) {

18

this.num = num;

19

 }

20

 public Student getStudent() {

21

return student;

22

 }

23

 public void setStudent(Student student) {

24

this.student = student;

25

 }

26

27

}

Student.hbm.xml

?

1 <hibernate-mapping package=“com.baosight.model”>

2 <class dynamic-update=“true” name=“Student”>

3 <id name=“id”>

4 <generator class=“native”></generator>

5 </id>

6 <property name=“name”></property>

7 <property name=“age”></property>

8 </class>

9 </hibernate-mapping>

StudentCard.hbm.xml

?

1 <hibernate-mapping package=“com.baosight.model”>

2 <class dynamic-update=“true” name=“StudentCard”>

3 <id name=“id”>

4 <generator class=“native”></generator>

5 </id>

6 <property name=“num”></property>

7 <many-to-one column=“studentId” name=“student”

8 unique=“true”></many-to-one>

9 </class>

</hibernate-mapping>

使用JUnit测试以及结果见1中的描述

3.OneToOne的外键双向映射

看看annotation版本

本例使用Husband和Wife为例,需要在Husband里面引用Wife,并在getWife上使用

@OneToOne@JoinColumn(name=“wifeId”),并在Wife里面引用Husband,并在getHusband上使用

@OneToOne(mappedBy=“wife”),需要注意的是,双向关联的映射一般需要在其中一个类中使用mappedBy=“wife”,表示

关联关系由Husband中的wife来维护。

Husband类与1中配置相同,这里不再赘述。

Wife类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

import javax.persistence.OneToOne;

7

8

@Entity

9

public class Wife {

10

 private String id;

11

 private String name;

12

 private Husband husband;

13

@Id

14

@GeneratedValue//auto

15

 public String getId() {

16

return id;

17

 }

18

 public void setId(String id) {

19

this.id = id;

20

 }

21

 public String getName() {

22

return name;

23

 }

24

 public void setName(String name) {

25

this.name = name;

26

 }

27

@OneToOne(mappedBy=“wife”)

28

 public Husband getHusband() {

29

return husband;

30

 }

31

 public void setHusband(Husband husband) {

32

this.husband = husband;

33

 }

34

}

使用JUnit测试,与1中配置相同,不再赘述。测试结果如下:

笔记插图(第 10 页)

\

4.OneToOne的外键双向映射

看看xml版本

使用Student和StudentCard,.,需要在StudentCard里面引用Student,并在StudentCard.hbm.xml使用,另外需要在

Student里面引用StudentCard,并在Student.hbm.xml使用,其中property-ref=“student"表示关联关系由StudentCard

的student来维持,同样地,在双向关联中这种配置是比较常见的。

StudentCard和StudentCard.hbm.xml的配置与2中完全相同,这里不再赘述。

Student类

?

1

package com.baosight.model;

2

3

4

public class Student {

5

 private String id;

6

 private String name;

7

 private int age;

8

 private StudentCard studentCard;

9

 public String getId() {

10

return id;

11

 }

12

 public void setId(String id) {

13

this.id = id;

14

 }

15

 public String getName() {

16

return name;

17

 }

18

 public void setName(String name) {

19

this.name = name;

20

 }

21

22

 public int getAge() {

23

return age;

24

 }

25

 public void setAge(int age) {

26

this.age = age;

27

 }

28

 public StudentCard getStudentCard() {

29

return studentCard;

30

 }

31

 public void setStudentCard(StudentCard studentCard) {

32

this.studentCard = studentCard;

33

 }

34

35

}

Student.hbm.xml

?

1 <hibernate-mapping package=“com.baosight.model”>

2 <class dynamic-update=“true” name=“Student”>

3 <id name=“id”>

4 <generator class=“native”></generator>

5 </id>

6 <property name=“name”></property>

7 <property name=“age”></property>

8 <one-to-one name=“studentCard” property-

9 ref=“student”></one-to-one>

10 </class>

</hibernate-mapping>

仍然使用JUnit进行测试(详见1),结果为:

笔记插图(第 12 页)

\

5.OneToOne的主键单向映射

先看annotation版本

本例使用Husband和Wife为例,需要在Husband里面引用Wife,并在getWife上使用@OneToOne@PrimaryKeyJoinColumn

Husband类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

import javax.persistence.JoinColumn;

7

import javax.persistence.OneToOne;

8

import javax.persistence.PrimaryKeyJoinColumn;

9

10

@Entity

11

public class Husband {

12

 private String id;

13

 private String name;

14

 private Wife wife;

15

@Id

16

@GeneratedValue//auto

17

 public String getId() {

18

return id;

19

 }

20

 public void setId(String id) {

21

this.id = id;

22

 }

23

 public String getName() {

24

return name;

25

 }

26

 public void setName(String name) {

27

this.name = name;

28

 }

29

@OneToOne

30

@PrimaryKeyJoinColumn

31

 public Wife getWife() {

32

return wife;

33

 }

34

 public void setWife(Wife wife) {

35

this.wife = wife;

36

 }

37

}

Wife类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

7

@Entity

8

public class Wife {

9

 private String id;

10

 private String name;

11

@Id

12

@GeneratedValue//auto

13

 public String getId() {

14

return id;

15

 }

16

 public void setId(String id) {

17

this.id = id;

18

 }

19

 public String getName() {

20

return name;

21

 }

22

 public void setName(String name) {

23

this.name = name;

24

 }

25

}

仍然使用1中的JUnit进行测试,结果为:

笔记插图(第 13 页)

\

6.OneToOne的主键单向映射

看看xml版本

使用Student和StudentCard,.,需要在StudentCard里面引用Student,并在StudentCard.hbm.xml使用

student

和,表示主键生成参考Student类色主键

StudentCard、Student和Student.hbm.xml的配置与2中完全相同,不再赘述

StudentCard.hbm.xml

?

1 <hibernate-mapping package=“com.baosight.model”>

2 <class dynamic-update=“true” name=“StudentCard”>

3 <id name=“id”>

4 <generator class=“foreign”><param

5 name=“property”>student

6 </generator>

7 </id>

8 <property name=“num”></property>

9 <one-to-one constrained=“true” name=“student”></one-

10 to-one>

</class>
</hibernate-mapping>

测试方法与5中相同,不再赘述,测试结果见5中

7.OneToOne的主键双向映射

看看annotation版本

本例使用Husband和Wife为例,需要在Husband里面引用Wife,并在getWife上使用@OneToOne@PrimaryKeyJoinColumn,

并在Wife里面引用Husband,并在getHusband上使用@OneToOne@PrimaryKeyJoinColumn。

Husband类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

import javax.persistence.JoinColumn;

7

import javax.persistence.OneToOne;

8

import javax.persistence.PrimaryKeyJoinColumn;

9

10

@Entity

11

public class Husband {

12

 private String id;

13

 private String name;

14

 private Wife wife;

15

@Id

16

@GeneratedValue//auto

17

 public String getId() {

18

return id;

19

 }

20

 public void setId(String id) {

21

this.id = id;

22

 }

23

 public String getName() {

24

return name;

25

 }

26

 public void setName(String name) {

27

this.name = name;

28

 }

29

@OneToOne

30

@PrimaryKeyJoinColumn

31

 public Wife getWife() {

32

return wife;

33

 }

34

 public void setWife(Wife wife) {

35

this.wife = wife;

36

 }

37

}

Wife类

?

1

package com.baosight.model;

2

3

import javax.persistence.Column;

4

import javax.persistence.EmbeddedId;

5

import javax.persistence.Entity;

6

import javax.persistence.GeneratedValue;

7

import javax.persistence.GenerationType;

8

import javax.persistence.Id;

9

import javax.persistence.IdClass;

10

import javax.persistence.OneToOne;

11

import javax.persistence.PrimaryKeyJoinColumn;

12

import javax.persistence.SequenceGenerator;

13

import javax.persistence.TableGenerator;

14

15

@Entity

16

public class Wife {

17

 private String id;

18

 private String name;

19

 private Husband husband;

20

@Id

21

@GeneratedValue//auto

22

 public String getId() {

23

return id;

24

 }

25

 public void setId(String id) {

26

this.id = id;

27

 }

28

 public String getName() {

29

return name;

30

 }

31

 public void setName(String name) {

32

this.name = name;

33

 }

34

@OneToOne

35

@PrimaryKeyJoinColumn

36

 public Husband getHusband() {

37

return husband;

38

 }

39

 public void setHusband(Husband husband) {

40

this.husband = husband;

41

 }

42

}

JUnit测试同上,结果为:

笔记插图(第 15 页)

\

笔记插图(第 15 页)

\

8.OneToOne的主键双向映射

看看xml版本

使用Student和StudentCard,.,需要在StudentCard里面引用Student,并在StudentCard.hbm.xml使用

student

和,表示主键生成参考Student类色主键

,另外需要在Student里面引用StudentCard,并在Student.hbm.xml使用,其中property-ref=“student"表示关联关系

由StudentCard的student来维持,同样地,在双向关联中这种配置是比较常见的。

StudentCard和StudentCard.hbm.xml的配置与6中完全相同,这里不再赘述。

Student类

?

1

package com.baosight.model;

2

3

4

public class Student {

5

 private String id;

6

 private String name;

7

 private int age;

8

 private StudentCard studentCard;

9

 public String getId() {

10

return id;

11

 }

12

 public void setId(String id) {

13

this.id = id;

14

 }

15

 public String getName() {

16

return name;

17

 }

18

 public void setName(String name) {

19

this.name = name;

20

 }

21

22

 public int getAge() {

23

return age;

24

 }

25

 public void setAge(int age) {

26

this.age = age;

27

 }

28

 public StudentCard getStudentCard() {

29

return studentCard;

30

 }

31

 public void setStudentCard(StudentCard studentCard) {

32

this.studentCard = studentCard;

33

 }

34

35

}

Student.hbm.xml

?

1 <hibernate-mapping package=“com.baosight.model”>

2 <class dynamic-update=“true” name=“Student”>

3 <id name=“id”>

4 <generator class=“native”></generator>

5 </id>

6 <property name=“name”></property>

7 <property name=“age”></property>

8 <one-to-one name=“studentCard” property-

9 ref=“student”></one-to-one>

10 </class>

</hibernate-mapping>

测试结果见7中

9.OneToOne的使用联合主键的类的外键映射

看看annotation版本

本例使用Husband和Wife为例,在Wife使用联合主键,创建联合住建磊WifePK,其需要implements Serializable和重写

equals和hashCode方法,Wife中使用@IdClass(WifePK.class)和@Id。需要在Husband里面引用Wife,并在getWife上使

用@OneToOne

@JoinColumns(

{

@JoinColumn(name=“wifeId”,referencedColumnName=“id”),

@JoinColumn(name=“wifeName”,referencedColumnName=“name”)

}
)

WifePK类

?

1 package com.baosight.model;

2

3 import java.io.Serializable;

4

5 import javax.persistence.Embeddable;

6

7 /**

8 * 联合主键类

9

*

Title:WifePK

*

Description:TODO

*

Company:

* @author yuan * @date 2016-4-19 下午8:25:56 */ //@Embeddable public class WifePK implements

Serializable{ private String id; private String name; public String getId() { return id; } public void

setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String

name) { this.name = name; } @Override public boolean equals(Object obj) { // TODO Auto-generated method

stub if(obj instanceof StudentPK){ StudentPK pk = (StudentPK)obj;

if(this.id.equals(pk.getId())&&this.name.equals(pk.getName())){ return true; } } return false; }

@Override public int hashCode() { // TODO Auto-generated method stub return this.id.hashCode(); } } Wife

类

?

1

package com.baosight.model;

2

3

import javax.persistence.Entity;

4

import javax.persistence.GeneratedValue;

5

import javax.persistence.Id;

6

import javax.persistence.IdClass;

7

8

@Entity

9

@IdClass(WifePK.class)

10

public class Wife {

11

 private String id;

12

 private String name;

13

 private String age;

14

@Id

15

@GeneratedValue//auto

16

 public String getId() {

17

return id;

18

 }

19

 public void setId(String id) {

20

this.id = id;

21

 }

22

@Id

23

 public String getName() {

24

return name;

25

 }

26

 public void setName(String name) {

27

this.name = name;

28

 }

29

 public String getAge() {

30

return age;

31

 }

32

 public void setAge(String age) {

33

this.age = age;

34

 }

35

}

测试类同上,结果为:

笔记插图(第 18 页)

\

笔记插图(第 18 页)

\

笔记插图(第 19 页)

\

10.OneToOne的使用联合主键的类的外键映射

看看xml版本

使用Student和StudentCard,.,在Student使用联合主键,创建联合住建磊StudentPK,其需要implements

Serializable和重写equals和hashCode方法,需要在Student中引用StudentPK,并在Student.hbm.xml中使用

,不要再使用id了,需要注意。

需要在StudentCard里面引用Student,并在StudentCard.hbm.xml使用

StudentPK

?

1 package com.baosight.model;

2

3 import java.io.Serializable;

4

5 /**

6 *

Title:StudentPK

*

Description:TODO

*

Company:

* @author yuan * @date 2016-4-15 下午8:08:16*/ public class StudentPK implements Serializable{ private

String id; private String name; public String getId() { return id; } public void setId(String id) {

this.id = id; } public String getName() { return name; } public void setName(String name) { this.name =

name; } @Override public boolean equals(Object obj) { // TODO Auto-generated method stub if(obj

instanceof StudentPK){ StudentPK pk = (StudentPK)obj;

if(this.id.equals(pk.getId())&&this.name.equals(pk.getName())){ return true; } } return false; }

@Override public int hashCode() { // TODO Auto-generated method stub return this.id.hashCode(); } }

Student

?

1

package com.baosight.model;

2

3

import javax.persistence.Column;

4

import javax.persistence.OneToOne;

5

6

public class Student {

7

// private String id;

8

// private String name;

9

 private int age;

10

 private StudentPK pk;

11

/* public String getId() {

12

return id;

13

 }

14

 public void setId(String id) {

15

this.id = id;

16

 }

17

 public String getName() {

18

return name;

19

 }

20

 public void setName(String name) {

21

this.name = name;

22

}*/

23

24

 public int getAge() {

25

return age;

26

 }

27

 public void setAge(int age) {

28

this.age = age;

29

 }

30

 public StudentPK getPk() {

31

return pk;

32

 }

33

 public void setPk(StudentPK pk) {

34

this.pk = pk;

35

 }

36

37

}

StudentCard

?

1

package com.baosight.model;

2

3

4

public class StudentCard {

5

 private String id;

6

 private String num;

7

 private Student student;

8

 public String getId() {

9

return id;

10

 }

11

 public void setId(String id) {

12

this.id = id;

13

 }

14

 public String getNum() {

15

return num;

16

 }

17

 public void setNum(String num) {

18

this.num = num;

19

 }

20

 public Student getStudent() {

21

return student;

22

 }

23

 public void setStudent(Student student) {

24

this.student = student;

25

 }

26

27

}

Student.hbm.xml

?

1

<hibernate-mapping package="com.baosight.model">

2

<class dynamic-update="true" name="Student">

3

<!-- <id name="id" >

4

<generator class="native"></generator>

5

</id> -->

6

<composite-id class="StudentPK" name="pk">

7

<key-property column="stu_id" name="id"></key-

8

property>

9

<key-property column="stu_name" name="name"></key-

10

property>

11

</composite-id>

12

<!-- <property name="name"></property> -->

13

<property name="age"></property>
</class>
</hibernate-mapping>

StudentCard.hbm.xml

?

1 <hibernate-mapping package=“com.baosight.model”>

2 <class dynamic-update=“true” name=“StudentCard”>

3 <id name=“id”>

4 <generator class=“native”></generator>

5 </id>

6 <property name=“num”></property>

7 <many-to-one class=“Student” insert=“false”

8 name=“student” update=“false”>

9 <column name=“stu_id”></column>

10 <column name=“stu_name”></column>

11 </many-to-one>

12 </class>

</hibernate-mapping>

使用上面的JUnit进行测试,结果为:

笔记插图(第 22 页)

\

笔记插图(第 22 页)

\

笔记插图(第 22 页)

\

笔记插图(第 22 页)

\

笔记插图(第 22 页)

\

以上即为OneToOne映射的内容,其实在实际使用中OneToOne用的不多,不过学习OneToOne对于学习后面的ManyToOne和

ManyToMany有帮助,可以看作是它们的特殊情形。总之,上述各种映射关系需要在实际的使用中仔细体会。