【HIBERNATE框架开发之六】HIBERNATE中ANNOTATION的关系映射&&组件映射!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/hibernate/821.html

准备工作,新建两个实体类如下:

Husband.class:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

package com.himi;

 

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.OneToOne;

 

@Entity

public class Husband {

@Id

@GeneratedValue

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Wife getWife() {

return wife;

}

public void setWife(Wife wife) {

this.wife = wife;

}

private int id;

private String name;

private Wife wife;

}

wife.class:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

package com.himi;

 

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

 

@Entity

public class Wife {

@Id

@GeneratedValue

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

private int id;

private String name;

}

生成数据库如下:

OK, 下面开始:

 1.  一对一:

          1.1 单向外键关联

使用注解   @OneToOne

当前Husband类中有一个wife对象,将其注解成OneToOne即可,那么观察生成的两张表如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

mysql> desc Husband;

+---------+--------------+------+-----+---------+----------------+

| Field   | Type         | Null | Key | Default | Extra          |

+---------+--------------+------+-----+---------+----------------+

| id      | int(11)      | NO   | PRI | NULL    | auto_increment |

| name    | varchar(255) | YES  |     | NULL    |                |

| wife_id | int(11)      | YES  | MUL | NULL    |                |

+---------+--------------+------+-----+---------+----------------+

3 rows in set (0.09 sec)

 

mysql> desc Wife;

+-------+--------------+------+-----+---------+----------------+

| Field | Type         | Null | Key | Default | Extra          |

+-------+--------------+------+-----+---------+----------------+

| id    | int(11)      | NO   | PRI | NULL    | auto_increment |

| name  | varchar(255) | YES  |     | NULL    |                |

+-------+--------------+------+-----+---------+----------------+

2 rows in set (0.00 sec)

其中如果想更改注解 @OneToOne默认为我们生成的Wife_id名,可以使用@JoinColumn(name=”xxx”) 即可;

      1.2.  双向外键关联 :

仍然使用注解  @OneToOne

但是如果是双向关联,必须设置其@OneToOne(mappedBy=”xxx”)     xxx表示对方那里是主导属性名”

1.3  单向主键关联:

在@OneToOne 下继续使用注解:@PrimaryKeyJoinColumn  即可 ;

 1.4  双向主键关联

在另外一个关联类中,@OneToOne 下也继续使用注解:@PrimaryKeyJoinColumn

2.  一对一联合主键映射:

类似其他映射,只是联合主键在自定义名字时,不能使用 @JoinColumn,而是使用如下形式:

1

2

3

4

5

6

7

@JoinColumns(

{

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

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

}

)

这里wifeId和wifeName是自定义主键名,referencedColumnName则对应其主键名;

 

3.(嵌入式对象)组件映射:

将另外一个类成为实体类的一部分进行映射;

注意:1.成为其他实体类一部门的类不要注解为@Entity 实体类!

2. 使用@Embedded 将其类注解即可;

3.组件属性名名为了保证不与实体类属性名冲突,可以使用如下注解:

3.1 使用如下形式:

1

2

3

4

5

6

7

@AttributeOverrides(

{

@AttributeOverride(name="xx",column=@Column(name="xxx")),

@AttributeOverride(name="xx2",column=@Column(name="xxx2")),

}

)

3.2 在嵌入式对象里,对其属性使用@column进行设置;

 

4.多对一单向关联

很容易,直接使用注解  @ManyToOne

5.   一对多单向关联

如果直接使用  @OneToMany 进行注解,默认Hibernate当成多对多进行映射,如果需要设置一对多,那么如下继续注解:

@JoinColumn(name=”GroupId”)   加入这个即可让默认多对多,当成一对多处理;

 

6.一对多、多对一双向关联

一对多,多对一双向关联属于一个映射;直接使用mappedBy即可(  @OneToMany(mappedBy=”xxx”)  );

 

7. 多对多单向关联

使用注解    @ManyToMany ,其中如果想自定义中间表的表名和类名可以使用 @JoinTable 关键字;

 

8.多对多双向关联

关联两个实体类 @ManyToMany即可;

时间: 2024-11-08 19:13:52

【HIBERNATE框架开发之六】HIBERNATE中ANNOTATION的关系映射&&组件映射!的相关文章

【HIBERNATE框架开发之七】HIBERNATE使用ANNOTATION中各种关系映射的CRUD(增删改查)&&集合映射&&继承映射

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/822.html       首先对于Annotation中CRUD的C(Create)操作:-------- 假设 :   User (MonyToOne)       Group OK,那么有如下 Junit Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Conf

【HIBERNATE框架开发之一】搭建HIBERNATE环境并成功运行第一个项目HELLOHIBERNATE并解决3个常出现的运行问题;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/783.html OK,从这篇开始Himi将与大家一起进入Hibernate框架的学习啦,新手新手的说,希望大家多多指教: 对于Hibernate概述一下: "  Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. H

【HIBERNATE框架开发之三】搭建HIBERNATE日志(SLF4J转LOG4J)环境并搭建JUNIT单元测试环境!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/806.html 由于最新写cocos2dx动作编辑器的解析和框架所以没更新,那么从今天开始继续来学习Hibernate,那么接着第二篇文章讲解,那么首先copy,第二篇的第一个Annotation的项目改个名字"LogForHibernate":           首先搭建log4j环境: 第一步我们之前设置

【HIBERNATE框架开发之四】HIBERNATE-ANNOTATION常用的注解归总&&ID的生成策略&&联合主键

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/811.html 这篇主要讲解Hibernate中Annotation的常用注解和ID的生成策略以及联合主键三块:     首先介绍些常用的Annotation注解: 1.  当表名与类名不一致: @Table(name="数据库表名")        (javax.persistence)      如果类名与

【HIBERNATE框架开发之二】第一个HIBERNATE-ANNONATION项目(采用@ENTITY、@ID直接映射实体类)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/789.html 紧接上一篇,这里Himi直接copy上一篇创建的HelloHibernate项目,然后改名为:HelloAnnonation,Ok:  OK,准备工作: 首先第一步,继续再我们自定义的user libraries 中添加Annotation所需的包,如下3个jar包(共11个包):            

【HIBERNATE框架开发之五】HIBERNATE对象的三种状态&&SESSION的常用方法

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/814.html  1. Hibernate对象的三种状态:(图解如下:)   如图所示,Hibernate对象有三种状态,1.Transient  2.Persistent 3.Detached; 三种状态的区别如下: 1. 当对象处于Transient时,只在内存中有一个对象,没ID,而且在缓存和数据库中没有: 2.

【HIBERNATE框架开发之八】HIBERNATE 查询语言QUERY LANGUAGE(HQL)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/824.html     生成一条HQL查询语句  Query,  使用Session的createQuery("hql语句")生成Query HQL语句: 1. "from className" class是类名:Hibernate会自动到数据库中找对应生成的表:   2."fro

【hibernate框架】搭建hibernate环境

我这次创建的是一个叫做student的表,里面存有id.name和age字段,我将搭建一个hibernate环境,利用框架的核心API对student进行数据插入.数据库用的是Mysql. 1.首先在工程中添加hibernate的jar包: 将解压路径中hibernate3.jar和lib路径下的required.jpa子目录下所有JAR包添加到应用的类加载路径中. hibernate的帮助文档在 hibernate-distribution-3.6.0.Final\documentation\

【HIBERNATE框架开发之九】HIBERNATE 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/825.html 1.   循环分页或者循环进行部分读取处理数据的时候,使用 session.clear() ;   2.    对应1+N(N+1)问题使用如下解决方式: 1): 使用createCriteria进行查询(join fetch) 2):HQL -> join fetch 3): 使用@fetch设置LAZ