> Java > java지도 시간 > 본문

두 가지 유형의 Hibernate 클래스 매핑 예제에 대한 자세한 설명

Y2J
풀어 주다: 2017-05-13 11:17:19
원래의
1444명이 탐색했습니다.

이 글에서는 Hibernate 매핑의 기본 클래스 매핑과 객체 관계 매핑을 중심으로 자세히 소개하고 있어 매우 실용적입니다. 필요하신 분들은 참고하시면 좋을 것 같습니다. ssh를 배우지 못했습니다. 데이터베이스 테이블의 경우 데이터베이스를 먼저 E-R 다이어그램으로 모델링한 다음 엔터티 모델을 통해 관계 모델을 구축한 다음 해당 테이블을 구축합니다. 엔터티 간의 관계에는 일대일, 일대다(또는 다대일) 및 다대다의 세 가지 유형이 있습니다. 이제 클래스를 기준으로 해당 테이블을 매핑하려면 클래스와 매핑 파일 간의 관계를 통해서만 데이터베이스 테이블을 매핑하면 됩니다. UML 모델링에는

상속

, 구현, 연관, 종속성, 집계/조합의 다섯 가지 관계가 있습니다. 서로 다른 관계에 해당하는 코드 구현에 이미 익숙하므로 엔터티 클래스에 대한 복습 지식입니다.
Hibernate의 핵심은 객체 관계형 매핑(

Object

Relational Mapping)입니다. 이전에는 객체 데이터를 데이터베이스에 저장하는 것을 구현했습니다. 추가, 삭제 및 수정, 쿼리 및 기타 작업이 이제 더 이상 관계형 테이블에서 작동하지 않고 개체에서 직접 작동됩니다. 최대 절전 모드의 ORM 매핑 파일에는 일반적으로 접미사 .hbm.xml이 있습니다. 이 매핑 파일을 사용하면 읽기 쉬울 뿐만 아니라 수동으로 수정할 수도 있고 일부 도구를 사용하여 매핑 문서를 생성할 수도 있습니다. 최대 절전 모드에서의 매핑은 아래에 소개됩니다.
Hibernate 매핑 분류는 아래 그림과 같습니다.


1 기본 클래스 매핑


엔티티 클래스를 기반으로 해당 테이블을 생성하는 간단한 관계 기본 매핑입니다. 최대 절전 모드용.


User1 엔터티 클래스 코드는 다음과 같습니다.


//user实体。 
public classUser1 { 
  //用户编号。 
  private String id; 
  
  //名字。 
  private String name; 
  
  //密码。 
  private String password; 
  
  //创建日期。 
  private Date createTime; 
  
  //失效时间。 
  private Date expireTime; 
  
  public String getId() { 
   return id; 
  } 
  
// publicvoid setId(String id) { 
//  this.id= id; 
// } 
  
  public String getName() { 
   return name; 
  } 
  
  public void setName(String name) { 
   this.name = name; 
  } 
  
  public String getPassword() { 
   return password; 
  } 
  
  public void setPassword(Stringpassword) { 
   this.password = password; 
  } 
  
  public Date getCreateTime() { 
   return createTime; 
  } 
  
  public void setCreateTime(DatecreateTime) { 
   this.createTime = createTime; 
  } 
  
  public Date getExpireTime() { 
   return expireTime; 
  } 
  
  public void setExpireTime(DateexpireTime) { 
   this.expireTime = expireTime; 
  } 
 }
로그인 후 복사

User1.hbm.xml 매핑 파일은 다음과 같습니다.


<hibernate-mapping package="com.bjpowernode.hibernate"> 
  
  <class name="User1" table="t_user1"> 
   <id name="id"column="user_id" length="32"access="field"> 
     <generator class="uuid" /> 
   </id> 
   <!-- 设置主键不能重复和不能为空的属性. --> 
   <property name="name" length="30"unique="true" not-null="true"/> 
   <property name="password"/> 
   <property name="createTime" type="date" column="create_time"/> 
   <property name="expireTime"/> 
  </class> 
</hibernate-mapping>
로그인 후 복사

User1.hbm.xml 매핑 파일을 통해 User1 개체를 관계형 데이터베이스의 t_user1 테이블로 변환합니다.


변환된 결과는 다음과 같습니다.

2 객체 관계형 매핑

2.1 다대일 연관 매핑(단방향)


예를 들어 사용자와 그룹 간의 관계는 다대일 관계이고 여러 사용자가 하나의 그룹에 해당합니다. .


항목을 테이블에 매핑하고 해당 항목을 테이블에 매핑합니다. 해당 속성은 테이블 필드에 매핑됩니다.


다대일 연관 매핑은 다측에서 연관 필드를 유지합니다. 이 예에서는 사용자 측에서 관계 필드를 유지합니다.


User.hbm.xml 파일입니다.


<hibernate-mapping package="org.hibernate.auction"> 
  
  <class name="com.bjpowernode.hibernate.User" table="t_user" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
   <many-to-one name="group" column="groupid"cascade="save-update"></many-to-one> 
  </class> 
</hibernate-mapping>
로그인 후 복사

Group.hbm.xml 파일입니다.


<hibernate-mapping package="org.hibernate.auction"> 
  
  <class name="com.bjpowernode.hibernate.Group" table="t_group"> 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
  </class> 
</hibernate-mapping>
로그인 후 복사

여기서 보는 코드는 *.hbm.mlx 코드입니다. 클래스 간 연결을 위해 구현 중에 한 클래스가 다른 Private 역할을 하기 때문입니다. 클래스의 구성원이라면 UML 모델링을 배울 때 우리 모두 이것을 이해합니다. 여기서 주로 보는 것은 ORM의 M, 즉 *.hbm.xml 파일입니다.


2.2 일대일 연관 매핑

일대일 연관 매핑은 사람과 사람의 관계 등 실생활에서 비교적 흔히 볼 수 있는 일입니다. 사람 개체는 자신의 집 주소와 관련된 콘텐츠를 찾을 수 있습니다.


2.2.1 일대일 매핑(단방향 기본 키 연관)

일대일 매핑 - 일대일 기본 키 연결, 기본 키가 동일하다는 사실에 의존하여 Person에서 IdCard를 볼 수 있습니다. 즉, t_idCard의 기본 키가 t_Pseron의 기본 키로 사용됩니다.

하나의 요소로 정의됩니다.


2.2.2 일대일 매핑(양방향 기본키 연관)


일대일 양방향 기본키 연관과 차이점 일대일 단방향 기본 키 연결은 쌍을 이루는 것입니다. 단방향 기본 키 연결의 경우 idCard는 개인 측에서 볼 수 있지만 idCard는 개인 측에서 볼 수 없습니다. 양방향 연결은 idCard 측에서도 사람을 볼 수 있음을 의미합니다. 즉, Person.hbm.xml에 태그를 추가하는 것뿐만 아니라 IdCard에 코드는 아래와 같습니다.


<class name="com.bjpowernode.hibernate.Person"table="t_person" > 
   <id name="id"> 
   <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> 
     <generator class="foreign" > 
     <!--property指的是关联对象。 --> 
      <param name="property">idCard</param> 
     </generator> 
   </id> 
   <property name="name"/> 
   <!-- 一对一关联映射,主键关联. --> 
   <!-- 
   one-to-one标签指示hibernate如何加载其关联对象,默认根据主键加载. 
   也就是拿到关系字段值,根据对端的主键来加载关联对象. 
   constrained="true",表示当前主键(Person的主键)还是一个外键 . 
   参照了对端的主键(IdCard的主键),也就是会生成外键约束语句. 
   --> 
   <one-to-one name="idCard" constrained="true"/> 
  </class>
로그인 후 복사


2.2.3 일대일 매핑(단방향) 고유 외래 키) 연관)

一对一单向唯一外键关联,也就是多对一关联的特例,把多的一端限制为一,就是一对一唯一外键关联。同多对一一样,在一端加入另一端的并采用标签,通过unique="true",这样来限制了多的一端为一。
先上代码。

IdCard.hbm.xml


<hibernate-mapping package="org.hibernate.auction"> 
  
  <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="cardNo"/> 
  </class> 
</hibernate-mapping>
로그인 후 복사

Person.hbm.xml


<hibernate-mapping package="org.hibernate.auction"> 
  
  <class name="com.bjpowernode.hibernate.Person" table="t_person" > 
   <id name="id"> 
   <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> 
     <generator class="native" /> 
    
   </id> 
   <property name="name"/> 
   <many-to-one name="idCard" unique="true"></many-to-one> 
  
  </class> 
</hibernate-mapping>
로그인 후 복사

图如下所示:

在t_pserson端加上一个外键字段idCard,限制idCard的唯一性就是一对一唯一外键关联。

2.2.4 一对一映射(双向唯一外键关联)

一对一唯一外键单向关联我们已经了解了,双向反过来就是在没有的一端加上就可以了。

我们的IdCard.hbm.xml中采用标签。


<hibernate-mapping package="org.hibernate.auction"> 
  
  <class name="com.bjpowernode.hibernate.IdCard" table="t_idCard" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="cardNo"/> 
   <one-to-one name="person" property-ref="idCard"></one-to-one> 
  </class> 
</hibernate-mapping>
로그인 후 복사

而person.hbm.xml同一对一唯一外键单向关联一样。


<class name="com.bjpowernode.hibernate.Person" table="t_person" > 
  <id name="id"> 
  <!-- 采用foreign生成策略,foreign会取得关联对象的标识 --> 
    <generator class="native" /> 
   
  </id> 
  <property name="name"/> 
  <many-to-one name="idCard" unique="true"></many-to-one> 
 
 </class>
로그인 후 복사

从上述中可以总结出,对于一对一关联映射,主键关联和唯一外键关联单向和双向产生出的表结构是一样的,不同的是在加载的时候不同。也就是一对一双向关联和一对一单向关联的相比,只是改变了一对一关联映射的加载,而没有改变存储。

2.3 一对多关联映射

2.3.1 一对多关联映射(单向)

上面我们介绍了多对一,我们反过来看一对多不就是多对一吗?那还用再进行不同的映射吗?有什么差别吗?一对多和多对一映射原理是一致的,存储是相同的,也就是生成的数据库的表是一样的,他们之间不同的是维护的关系不同。

他们之间不同点是维护的关系不同

  1. 多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来。

  2. 一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来。

代码如下所示。

Class.hbm.xml


<class name="com.bjpowernode.hibernate.Classes" table="t_Classes" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
   <set name="students"> 
   <!-- 
     <keycolumn="classesid" not-null="true"/> 
   --> 
     <key column="classesid" /> 
     <one-to-many class="com.bjpowernode.hibernate.Student"/> 
   </set> 
  </class>
로그인 후 복사

Students.hbm.xml


<class name="com.bjpowernode.hibernate.Student" table="t_student" > 
   <id name="id"> 
    <generator class="native" /> 
   </id> 
   <property name="name"/> 
 </class>
로그인 후 복사

从班级能看到学生,是班级来维护关系,不是学生来维护关系,学生不知道自己是哪个班,所以在存储学生的时候,班级的代码不知道。为了更新学生是哪个班级的要发出很多update语句来告诉学生是哪个班级的。当我们设置classesid not-null=“true”时,则将无法保存数据,解决办法我们改为双向关联映射。

2.3.2 一对多关联映射(双向)

为了解决一对多单向可能存在的问题,我们采用双向一对多,每一方都能维护对方。

一对多双向关联映射方式:

  1. 在一的一端的集合上采用标签,在多的一端加入一个外键。

  2. 在多的一端采用的标签

!~注意标签和标签加入字段保持一致,否则会产生数据混乱。

代码如下所示。


<class name="com.bjpowernode.hibernate.Classes" table="t_Classes" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
   <set name="students" inverse="true"> 
   <!-- 
     <keycolumn="classesid" not-null="true"/> 
   --> 
     <key column="classesid" /> 
     <one-to-many class="com.bjpowernode.hibernate.Student"/> 
   </set> 
  </class>
로그인 후 복사


<class name="com.bjpowernode.hibernate.Student" table="t_student" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
    <many-to-one name="classes"column="classesid"/> 
  </class>
로그인 후 복사

注意:Inverse属性

1、 Inverse中文意思为相反的,反转。在hibernate中inverse可以用在一对多和多对多双向关联上,inverse默认是false,为false的时候表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效,所以在一对多关联映射我们通常在多的一端维护关系,让一的一端失效。

2、Inverse是控制方向上的反转,只影响存储。

比较一对多单向和双向映射,从存储结构上看没有什么区别,但是从配置文件上看,一对多双向比一对多单向,一对多双向关联的配置文件中在多的一端的配置文件上存在相关配置,即保证多对一的映射。

2.4 多对多关联映射

2.4.1 多对多关联映射(单向)

多对多对象关系映射,需要加入一张新表完成基本映射。如下图所示。

代码。

Role.hbm.xml


<class name="com.bjpowernode.hibernate.Role" table="t_role"> 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
    
  </class>
로그인 후 복사

User.hbm.xml


<class name="com.bjpowernode.hibernate.User" table="t_user" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
     
   <set name="roles" table="t_user_role"> 
     <key column="user_id"/> 
     <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/> 
   </set> 
  </class>
로그인 후 복사

2.4.2 多对多关联映射(双向)

双向多对多对象关系映射,是两端都能将对方加载上来,双向都需要加上标签映射。
要注意:

  1. 生成中间表名必须一样

  2. 生成中间表字段必须一样

代码如下所示。

Role.hbm.xml


<class name="com.bjpowernode.hibernate.Role" table="t_role"> 
   <id name="id"> 
    <generator class="native" /> 
   </id> 
   <property name="name"/> 
   
   <set name="users" table="t_user_role"> 
    <key column="role_id"/> 
    <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> 
   </set> 
 </class>
로그인 후 복사

User.hbm.xml


<class name="com.bjpowernode.hibernate.User"table="t_user" > 
   <id name="id"> 
     <generator class="native" /> 
   </id> 
   <property name="name"/> 
     
   <set name="roles" table="t_user_role"> 
     <key column="user_id"/> 
     <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/> 
   </set> 
  </class>
로그인 후 복사

区别:单向多对多和双向多对多存储结构没有任何的区别,但他们的映射文件是有区别的,加载过程是不同的。

 3  关系映射总结

综上所述,可以看出,同一类映射,无论是单向还是双向,他们的存储结构是相同的,之所以映射文件不同,是因为加载时不同(在增删改时)。

无论是多对一、一对多、一对一还是多对一,A对B,A就是主动方,A主动想要了解B的情况,这样把B设置到A端。而双向,也就是A对B,A想了解B的信息,而B也想了解A的信息,那就要同时把A设置到B端了。

【相关推荐】

1. 特别推荐“php程序员工具箱”V0.1版本下载

2. Java免费视频教程

3. 阿里巴巴Java开发手册

위 내용은 두 가지 유형의 Hibernate 클래스 매핑 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿