- 浏览: 914836 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
Hibernate Annotation几种关联映射
一对一(One-To-One)
使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键(注意要模拟一对一关联必须在外键列上添加唯一约束),(3).通过关联表来保存两个实体之间的连接关系(要模拟一对一关联必须在每一个外键上添加唯一约束)。
1.共享主键的一对一关联映射:
@Entity
@Table(name="Test_Body")
public class Body {
private Integer id;
private Heart heart;
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToOne
@PrimaryKeyJoinColumn
public Heart getHeart() {
return heart;
}
public void setHeart(Heart heart) {
this.heart = heart;
}
}
@Entity
@Table(name="Test_Heart")
public class Heart {
private Integer id;
@Id
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
通过@PrimaryKeyJoinColumn批注定义了一对一关联
2.使用外键进行实体一对一关联:
@Entity
@Table(name="Test_Trousers")
public class Trousers {
@Id
public Integer id;
@OneToOne
@JoinColumn(name = "zip_id")
public TrousersZip zip;
}
@Entity
@Table(name="Test_TrousersZip")
public class TrousersZip {
@Id
public Integer id;
@OneToOne(mappedBy = "zip")
public Trousers trousers;
}
上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip关联,@JoinColumn批注定义了联接列,该批注和@Column批注有点类似,但是多了一个名为referencedColumnName的参数。该参数定义了所关联目标实体中的联接列,注意,当referencedColumnName关联到非主键列的时候,关联的目标类必须实现Serializable,还要注意的是所映像的属性对应单个列(否则映射无效)
一对一关联可能是双向的,在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中,mappedBy的值为zip。最后,不必也不能再在被关联端(ownedside)定义联接列了,因为已经在主体端声明了。
如果在主体没有声明@JoinColumn,系统自动进行处理:在主表(owner table)中将创建联接列,列名为:主体的关联属性名+下划线+被关联端的主键列名。上面的例子中是zip_id,因为Trousers中的关联属性名为zip,TrousersZip的主键是id。
3.通过关联表定义一对一关联
@Entity
@Table(name="Test_People")
public class People {
@Id
public Integer id;
@OneToOne
@JoinTable(name ="TestPeoplePassports",
joinColumns =@JoinColumn(name="people_fk"),
inverseJoinColumns =@JoinColumn(name="passport_fk")
)
public Passport passport;
}
@Entity
@Table(name="Test_Passport")
public class Passport {
@Id
public Integer id;
@OneToOne(mappedBy = "passport")
public People people;
}
People通过名为TestPeoplePassports的关联表和Passport关联。该关联表拥有名为passport_fk的外键列,该外键指向Passport表,该信息定义为inverseJoinColoumns的属性值,而people_fk外键列指向People表,该信息定义为joinColumns的属性值。
这种关联可能是双向的,在双向关联中,有且仅有一端作为主体(owner)端存在:主体端负责维护联接列(即更新),对于不需要维护这种关系的从表则通过mappedNy属性进行声明。mappedBy的值指向主体的关联属性。例子中,mappedBy的值为passport。最后,不必也不能再在被关联端(ownedside)定义联接列了,因为已经在主体端声明了。
以上是一对一关联的三种形式,下面介绍多对一关联。
多对一(Many-to-One)
使用@ManyToOne批注来实现多对一关联。
@ManyToOne批注有一个名为targetEntity的参数,该参数定义了目标实体名,通常不需要定义该参数,因为在大部分情况下默认值(表示关联关系的属性类型)就可以很好的满足需求了。不过下面这种情况下这个参数就显得有意义了:使用接口作为返回值而不是常见的实体。
@ManyToOne(targetEntity=CompanyImpl.class)
@JoinColoumn(name=”COPM_ID”)
Public Company getCompany(){
return company;
}
多对一的配置方式有两种:(1)通过@JoinColoumn映像(2)通过关联表的方式来映像
(1) 通过@JoinColoumn映射
SRD Framework中Company,Category例子:
Company:
@ManyToOne
@JoinColumn(name = "CATEGORY_OPTION_ID")
private Category category = null;
Category:
@DiscriminatorValue("Category")
public class Category extends Option {
}
(2) 通过关联表映射
通过@JoinTable批注定义关联表,该关联表包含了指回实体表的外键(通过@JoinTable.joinColoumns)以及指向目标实体表的外键(通过@JoinTable.inverseJoinColoumns)
@Entity
@Table(name="Test_TreeType")
public class TreeType {
private Integer id;
private String name;
private ForestType forestType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(name="Test_Tree_Forest",
joinColumns = @JoinColumn(name="tree_id"),
inverseJoinColumns = @JoinColumn(name="forest_id") )
public ForestType getForestType() {// forestType的getter,setter方法必须在这里,否则会出错
return forestType;
}
public void setForestType(ForestType forestType) {
this.forestType = forestType;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
@Table(name="Test_ForestType")
public class ForestType {
private Integer id;
private String name;
private Set<TreeType> trees;
@OneToMany(mappedBy="forestType")
public Set<TreeType> getTrees() {// trees的getter,setter方法必须在这里,否则会出错
return trees;
}
public void setTrees(Set<TreeType> trees) {
this.trees = trees;
}
@Id @GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
一对多(One-to-Many)
使用@OneToMany批注可定义一对多关联,一对多关联可以是双向关联。
在EJB3规范中多对一这端几乎总是双向关联中的主体(owner)端,而一对多这端关联批注为@OneToMany(mappedBy...)
@Entity
Public class Troop{
@OneToMany(mappedBy=”troop”)
Public Set<Soldier> getSoldiers(){
......
}
@Entity
Public class Soldier{
@ManyToOne
@JoinColumn(name=”troop_fk”)
Public Troop getTroop(){
......
}
Troop通过troop属性和Soldier建立一对多的双向关联,在mappedBy端不必也不能再定义任何物理映射。
对于一对多的双向映射,如果要一对多这一端维护关联关系,你需要删除mappedBy元素并将多对一这端的@JoinColoumn的insertable和updatabel设置为false。这种方案不会得到什么明显的优化,而且还会增加一些附加的UPDATE语句。
单向:
通过在被拥有的实体端(owned entity)增加一个外键列来实现一对多单向关联是很少见的,也是不推荐的,建议通过一个联接表来实现这种关联(下面会讲到)。
@JoinColoumn批注来描述这种单向关联关系
@Entity
Public class Customer{
@OneToMany
@JoinColoumn(name=”CUST_ID”)
Public Set<ticket> getTickets() {
......
}
@Entity
Public class Ticket{
...
}
Customer通过CUST_ID列和Ticket建立了单向关联关系
通过关联表处理单向关联:
通过联接表处理单向一对多关联是首选方式,这种关联通过@JoinTable批注进行描述
@Entity
Public class Trainer{
@OneToMany
@JoinTable(
name = "TrainedMonkeys",
jonColumns = {@JoinColumn(name = "trainer_id")},
inverseJoinColumns = @JoinColumn(name = "monkey_id")
)
public Set<Monkey> getTrainedMonkeys() {
return trainedMonkeys;
}
......
}
@Entity
public class Monkey {
...//no bidir
}
上面这个例子中,Trainer通过TrainedMonkeys表和Monkey建立了单向关联,其中外键trainer_id关联到Trainer(joinColoumn),而外键monkey_id关联到Monkey(inversejionColoumns)
默认处理机制:
通过联接表来建立单向一对多关联不需要描述任何物理映像,表名由以下三个部分组成:主表(ownertable)表名+从表(the other side table)表名,指向主表的外键名:主表表名+下划线+主表主键列名,指向从表的外键名:主表所对应实体的属性名+下划线+从表主键列名,指向从表的外键定义为唯一约束,用来表示一对多的关联关系。
@Entity
public class Trainer{
@OneToMany
Public Set<Tiger> getTrainedTigers(){
... ...
}
@Entity
public class Tiger{
.. ..//no bidir
}
上面这个例子中,Trainer和Tiger通过联接表Trainer_Tiger建立单向关联关系,其中外键trainer_id关联到Trainer,而外键trainedTigers_id关联到Tiger
多对多(Many-to-Many)
使用@ManyToMany批注可定义多对多关联,同时,你也许要通过批注@JoinTable描述关联表和关联条件。如果是双向关联,其中一段必须定义为Owner,另一端必须定义为inverse(在对关联表进行更新操作时这一端将被忽略)
@Entity()
public class Employer implements Serializable {
private Integer id;
private Collection employees;
@ManyToMany(
targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
)
@JoinTable(
name = "EMPLOYER_EMPLOYEE",
joinColumns = {@JoinColumn(name = "EMPER_ID")},
inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
)
public Collection getEmployees() {
return employees;
}
...
}
@Entity()
public class Employee implements Serializable {
@ManyToMany(
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
mappedBy = "employees"
targetEntity = Employer.class
)
public Collection<Employer> getEmployers() {
return employers;
}
.. ..
}
@JoinTable批注定义了联接表的表名,联接列数组,以及invers联接列数组,后者是关联表中关联到Employee主键的列(the “other side”)。
被关联端不必也不能描述物理映射:只需要一个简单的mappedBy参数,该参数包含了主体端的属性名,这样就绑定了双方的关系。
默认值:
和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+主表中的主键列名,关联到从表的外键名:主表中用于关联的属性名+下划线+从表的主键列名,以上规则对于双向一对多关联同样一样。
发表评论
-
hibernate n+1问题
2010-10-21 11:05 931Hibernate中常会用到set,bag等集合表示1对多的关 ... -
Hibernate 关联关系 总结
2010-09-09 15:27 9581.一对多的单向关联关系 配置单向的一对多关系是 ... -
Hibernate 关联
2010-09-09 15:24 10011、hibernate多对一关联映 ... -
Hibernate一对多(单向)
2010-09-09 14:31 594[正文]: Hibernate一对多关联,例如一个用户有 ... -
Hibernate中No row with the given identifier exists问题的原因及解决
2010-06-23 09:54 936产生此问题的原因: ... -
Hibernate使用count(*)取得表中记录总数(跨Hibernate3.x版本问题)
2010-06-22 17:13 1531Java代码 /** * @T ... -
hibernate继承关系映射
2010-06-13 16:58 919hbn 的继承映射关系有这 ... -
Hibernate集合映射
2010-06-13 12:49 913准备找工作,重新整理一下Hibernate,今天做了集合映射 ... -
高并发网站的架构
2010-05-07 11:07 716我在CERNET做过拨号接入平台的搭建,而后在Yaho ... -
Hibernate事务和并发控制
2010-05-07 10:21 9141. 事务介绍:1.1. 事务的定义:事务就 ... -
hibernate中lazy的使用
2009-12-18 22:00 779lazy,延迟加载 Lazy的 ... -
Hibernate中代码自动生成功能小结
2009-12-06 15:10 1035Hibernate中需要class和mapping file, ... -
hibernate工具箱—根据映射文件自动建表
2009-12-04 12:08 977public class ExportDB { ... -
关联加载对象时的报错-----a different object with the same identifier value
2009-11-18 16:13 885因为在hibernate中同一个session里面有了两个相同 ... -
update/saveOrUpdate/merge
2009-11-18 15:28 1140通常下面的场景会使用update()或saveOrUpdate ... -
写得很不错的-Hibernate中的实体状态(二)
2009-11-18 15:08 949(2)session.merge ()方法 ... -
写得很不错的-Hibernate中的实体状态(一)
2009-11-18 15:04 1137持久层的解决方案有许 ... -
Hibernate3.x总结
2009-11-18 14:29 751Hibernate不是盏省油的灯 ... -
hibernate3的注解映射学习
2009-11-02 16:41 1345注解映射必须满足两大条件:Hibernate3.2以上版本和J ... -
Hibernate 中级联操作 cascade 选项
2009-11-02 16:35 927none :在保存、更新或删除对象时,忽略其他关联的对象。他是 ...
相关推荐
Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键...
以下是几种常用的注解: - **@Entity**:标记类为Hibernate的实体类。 - **@Table**:指定实体类所对应的数据库表名。 - **@Id**:标识主键字段。 - **@GeneratedValue**:定义主键生成策略。 - **@Column**:...
Annotation是Hibernate提供的一种元数据方式,允许在Java类和字段上直接添加注解,以声明对象与数据库表之间的映射关系,从而替代传统的XML配置文件。 ### 第 1 课 课程内容 学习Hibernate Annotation,首先要理解...
主要有以下几种类型: 1. **一对一(OneToOne)**:一个实体对应表中的唯一一行数据。可以通过`@OneToOne`注解来定义,可以设置`fetch`属性来控制加载策略,并使用`mappedBy`来指定被引用的一方。 2. **一对多...
根据给定文件的信息,本文将详细介绍Hibernate ORM(Object Relational Mapping)中关于不同类型的关联映射方式,并结合Annotation和XML两种配置方式来进行说明。 ### 一、一对一单向外键关联 在一对一单向外键...
在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体之间一对一的关系。这种关系通常出现在一个实体的实例只能与另一个实体的单个实例相关联的情况。下面我们将...
在探讨Hibernate中注释的几种配置方式时,我们主要聚焦于如何通过注解来定义实体类与数据库表之间的映射关系,以及如何在Spring框架下整合Hibernate,利用注解进行SessionFactory的配置。以下是对给定内容中涉及的...
Hibernate支持一对一、一对多、多对一、多对多等多种关联映射。例如,使用@OneToOne、@OneToMany、@ManyToOne、@ManyToMany注解定义不同类型的关联。 九、性能优化 通过合理配置缓存、批处理、延迟加载等策略,可以...
3. Criteria API 和 HQL(Hibernate Query Language):这两种查询语言提供了灵活的数据检索方式,HQL是面向对象的查询语言,类似SQL,而Criteria API则是基于对象的API,更易于使用和动态构建查询。 4. Cache:为了...
为了利用注解来配置缓存,我们需要在实体类和关联映射上添加特定的注解。在Hibernate中,我们可以使用`@Cache`注解来标记实体类或集合属性,以便将其放入缓存。以下是一个示例: ```java @Entity @Cache(usage = ...
基本映射策略包括注解(Annotation)映射和XML映射两种方式。注解映射直观简洁,适合快速开发;而XML映射则更灵活,易于管理。 ### 10. 主键映射 主键是表的唯一标识,Hibernate提供了自然主键和代理主键的概念。...
7. Criteria API和Hibernate Annotation:Hibernate提供了注解,允许开发者在实体类上直接声明字段的数据库映射、生成策略等,Criteria API则提供了一种更面向对象的查询方式。 在实际应用中,Hibernate提供了以下...
Struts2+Spring+Hibernate(S2SH)是一种常见的Java Web开发框架组合,它整合了三个强大的开源框架:Struts2作为MVC框架处理请求和视图,Spring提供依赖注入和事务管理,Hibernate则作为对象关系映射工具处理数据库...
3. **实体映射**:讲解如何将Java类映射到数据库表,包括实体类的注解、属性映射、关联关系(一对一、一对多、多对多)的配置,以及主键生成策略。 4. **Session接口**:Hibernate的核心接口,负责对象的保存、更新...
在Hibernate3.2版本中,核心知识点主要包括以下几个方面: 1. **对象关系映射(ORM)基础**:Hibernate作为一款强大的ORM框架,将数据库中的表与Java对象对应,通过注解或XML配置文件实现数据层的抽象。理解实体类...
- **关联映射**:支持一对一、一对多等关联关系的映射。 - **组合**:支持组合关系的映射,即一个类的实例包含另一个类的实例。 - **查询语言**:提供了Hibernate Query Language (HQL),一种类似于SQL的语言,但...
以给定的`Department.java`和`Employee.java`为例,我们可以通过以下几种主要的注解来实现: - `@Entity`:表示该类是一个实体类。 - `@Table`:指定实体类对应的数据库表名以及所在的数据库目录(catalog)。 - `@...