用户登录
用户注册

分享至

hibernate组合映射

  • 作者: 一梦一轮回丶
  • 来源: 51数据库
  • 2021-01-30
对象关系的映射是用一个XML文件来说明的。映射文件能使用工具来生成,如XDoclet,Middlegen和AndroMDA等。下面从一个映射的例子开始讲解映射元素,映射文件的代码如下。

<?xml version="1.0"?>
<!--
所有的XML映射文件都需要定义如下所示的DOCTYPE。
Hibernate会先在他的类路径(classptah)中搜索DTD文件。

-->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--
hibernate-mapping有几个可选的属性:
schema属性指明了这个映射的表所在的schema名称。
default-cascade属性指定了默认的级联风格 可取值有 none、save、update。
auto-import属性默认让我们在查询语言中能使用非全限定名的类名 可取值有 true、false。
package属性指定一个包前缀。
-->

<hibernate-mapping schema="schemaName" default-cascade="none"
auto-import="true" package="test">

<!--用class元素来定义一个持久化类 -->
<class name="People" table="person">
<!-- id元素定义了属性到数据库表主键字段的映射。-->
<id name="id">
<!-- 用来为该持久化类的实例生成唯一的标识 -->
<generator class="native"/>
</id>
<!-- discriminator识别器 是一种定义继承关系的映射方法-->

<discriminator column="subclass" type="character"/>
<!-- property元素为类声明了一个持久化的,JavaBean风格的属性-->
<property name="name" type="string">
<column name="name" length="64" not-null="true" />
</property>

<property name="sex"
not-null="true"
update="false"/>

<!--多对一映射关系-->
<many-to-one name="friend"
column="friend_id"
update="false"/>

<!--设置关联关系-->

<set name="friends" inverse="true" order-by="id">
<key column="friend_id"/>
<!?一对多映射-->
<one-to-many class="Cat"/>
</set>
</class>
</hibernate-mapping>



  Hibernate的关联关系映射
1.单向关联:
a.多对一:
在子表中加入:
<many-to-one name="address" column="addressId" not-null="true"/>

b.一对一:其实就是many-to-one的一种情况.唯一不同的就是关联中的外键字段具有唯一性约束.
在子表中加入:(unique="true")
<many-to-one name="address" column="addressId" unique="true" not-null="true"/>
或者
在主表加入:
<one-to-one name="person" constrained="true"/>

c.一对多:
在主表中加入:
<set name="addresses">
<key column="personId" not-null="true"/>
<one-to-many class="Address"/>
</set>

2.使用连接表的单向关联
a.一对多:通过制定unique="true",我们可以把多样性从多对多改变为一对多。
在主表中添加:
<set name="addresses" table="PersonAddress">
<key column="personId"/>
<many-to-many column="addressId" unique="true" class="Address"/>
</set>

b.多对一:
在子表中添加:
<join table="PersonAddress" optional="true">
<key column="personId" unique="true"/>
<many-to-one name="address" column="addressId" not-null="true"/>
</join>

c.一对一:
在子表中添加:
<join table="PersonAddress" optional="true">
<key column="personId" unique="true"/>
<many-to-one name="address" column="addressId" not-null="true" unique="true"/>
</join>

d.多对多:
<set name="addresses" table="PersonAddress">
<key column="personId"/>
<many-to-many column="addressId" class="Address"/>
</set>

3.双向连接:
a.一对多/多对一:
在子表中添加:(子表跟单向的完全相同)
<many-to-one name="address" column="addressId" not-null="true"/>
在主表中添加:(主表比单向多一个inverse="true")
<set name="people" inverse="true">
<key column="addressId"/>
<one-to-many class="Person"/>
</set>

b.一对一:
基于外键关联:
在子表中添加:(子表跟单向的完全相同)
<many-to-one name="address" column="addressId" unique="true" not-null="true"/>
在主表中添加:(主表比单向不同的是constrained="true"改成property-ref="address")
<one-to-one name="person" property-ref="address"/>
或者
基于主键关联的:
在子表中添加:
<one-to-one name="address"/>
在主表中添加:
<one-to-one name="person" constrained="true"/>

4.使用连接表的双向关联:
a.一对多/多对一
在子表中添加:
<set name="addresses" table="PersonAddress">
<key column="personId"/>
<many-to-many column="addressId" unique="true" class="Address"/>
</set>
在主表中添加:
<join table="PersonAddress" inverse="true" optional="true">
<key column="addressId"/>
<many-to-one name="person" column="personId" not-null="true"/>
</join>

b.一对一:
在子表中添加:
<join table="PersonAddress" optional="true">
<key column="personId" unique="true"/>
<many-to-one name="address" column="addressId" not-null="true" unique="true"/>
</join>
在主表中添加:
<join table="PersonAddress" optional="true" inverse="true">
<key column="addressId" unique="true"/>
<many-to-one name="address" column="personId" not-null="true" unique="true"/>
</join>

c.多对多:
<set name="addresses">
<key column="personId"/>
<many-to-many column="addressId" class="Address"/>
</set>

<set name="people" inverse="true">
<key column="addressId"/>
<many-to-many column="personId" class="Person"/>
</set>



  string hql = "select name, count(*) from table group by name"; //跟sql语句差不多的,不过这里的name是类的属性,table 是类名,因为hql是面向对象的查询的语言。 首先要获得session,你懂的, 然后 query query = session.createquery(hql); list list = query.list(); 获取list里面的name : iterator it = lits.iterator(); if(it.hasnext()){ object[] obj = (object[]) it.next(); string name = obj[0]; int count = obj[1]; }



  额,你这个是不是也太宽泛了,hibernate中的映射关系很多
一对一(主外建)一对一主键对主键
1对多
多对多
以下2种是不常用的
继承
组合
如果你想具体了解,可以在知道联系我
软件
前端设计
程序设计
Java相关