兔八哥笔记15(1):Hibernate中的父子关系

原创 2004年01月07日 18:17:00

兔八哥笔记15Hibernate中的父子关系

          邮箱:ltf_ty@163.net

 

       本文翻译自Hibernate帮助文档的第九章。

Hibernate的新用户用Hibernate做的第一件事情很可能就是建立一个父子关系的数据模型。要达到这个目的,有2种途径:由于有不同的情况,最方便(特别是对于一个Hibernate的新用户来说)的途径是同时建立2个实体,一个是Parent,另一个是Child,然后建立一个从ParentChild<one-to-many>关联。另外一个途径是生命Child作为Parent<composite-element>Now, it turns out that default semantics of a one to many association (in Hibernate) are much less close to the usual semantics of a parent / child relationship than those of a composite element mapping.(这句没太读明白)。下面我们将向你展示怎样使用bidirectional one to many association with cascades去建立一个优雅且有效率的父子关系的模型,一点都不难!

 

9.1 关于集合的小结(A note about collections

       Hibernate集合被认为是实体自己的一个逻辑部分,而不是被包含的实体。这个区别是至关重要的!

       当我们从一个集合中增加或删除一个对象时,集合所有者的版本号将会增加。

       如果从集合中被删除的对象是一个值类型的实例(eg, a composite element),对象将不再是持久的,它的状态将从数据库中完全删除。同样,向集合中增加一个值类型的实例时,将会使它的状态立刻被持久化。

       另一方面,如果一个实体从一个集合(a one-to-many or many-to-many association),中被removed,默认情况下,关联的实体将不被删除(deleted)。这个行为同下面的说法是完全一致的:其他实体的内部状态的改变不应该引起相关联的实体的消失(vanish)!同样,向集合中增加一个实体,在默认情况下,不会引起实体被持久化。

       所以,向集合中增加一个实体时,仅仅是创建了一个两个实体之间的连接(link),而删除时,也仅仅删除了连接(link),这个规则适合各种各样的(all sorts of)情况。但也有根本不适合的情况:在父子关系中,Child的生命被绑定到Parent对象的生命期(lifecycle)中。

      

9.2 双向的one-to-manyBidirectional one to many

       假设我们有一个简单的从ParentChild对象的<one-to-many>关联:

<set name="children">

      <key column="parent_id"/>

      <one-to-many class="Child"/>

</set>

    如果我们要执行下面的代码:

Parent p = .....;

Child c = new Child();

p.getChildren().add(c);

session.save(c);

session.flush();

Hibernate将转换成2SQL语句:

²        一条为创建Childinsert语句

²        一条创建ParentChild的关系的update语句

这样做不仅效率低下,而且违反了parent_id列的NOT NULL约束。

下面的动机是:从ParentChild的连接(外键:parent_id)没有被作为Child的状态的部分被考虑,所以在Insert中没有被创建。所以,我们将建立Child映射部分的连接:

<many-to-one name="parent" column="parent_id" not-null="true"/>

       我们也需要为Child类增加parent属性。

       现在Child实体被作为连接的状态被管理,我们使用inverse告诉集合不要去更改连接。

     <set name="children" inverse="true">

          <key column="parent_id"/>

        <one-to-many class="Child"/>

   </set>

   下面的代码将添加一个新的Child:

Parent p = (Parent) session.load(Parent.class, pid);

Child c = new Child();

c.setParent(p);

p.getChildren().add(c);

session.save(c);

session.flush();

现在,只有一个Insert语句被执行!

       下面我们为Parent添加一个addChild()方法:

public void addChild(Child c) {

    c.setParent(this);

    children.add(c);

}

现在,添加一个Child的代码应该看起来像这样:

Parent p = (Parent) session.load(Parent.class, pid);

Child c = new Child();

p.addChild(c);

session.save(c);

session.flush();

Hibernate的实体类注解详解

@Entity //继承策略。另一个类继承本类,那么本类里的属性应用到另一个类中 @Inheritance(strategy = InheritanceType.JOINED ) @Table(na...
  • qiaoshuai0920
  • qiaoshuai0920
  • 2014年03月28日 15:16
  • 1878

《Hibernate学习笔记二》:表与实体类的映射方法

Hibernate学习笔记二:表名与实体类名不一致/表中的列名与实体属性名不一致的映射方法在使用Hibernate 中,我们最好尽量使得实体类的名字与表的名字 、实体类的属性名与表的列名尽量相同,这...
  • u010412719
  • u010412719
  • 2016年04月27日 20:46
  • 1626

eclipse用hibernate tools从数据库逆向生成Hibernate实体类

eclipse用hibernate tools从数据库逆向生成Hibernate实体类
  • u012838836
  • u012838836
  • 2017年01月04日 17:17
  • 2209

eclipse从数据库逆向生成Hibernate实体类(eclipse中反向生成hibernate实体类+jpa注释)

eclipse中反向生成hibernate实体类+jpa注释
  • andyliulin
  • andyliulin
  • 2014年05月21日 20:40
  • 22189

hibernate 自动生成(注解的)实体类

首先我使用的是最新的 Eclipse4.6 ,然后hibernate 是用的5.1 1.先去下载hibernate插件     这边需要注意一下在 http://download.jboss.org...
  • flyjiangs
  • flyjiangs
  • 2016年06月01日 14:08
  • 4564

Hibernate实体类注解配置与xml配置

Hibernate实现有两种配置,xml配置与注释配置 hibernate实现有两种配置,xml配置与注释配置。 (1):xml配置:hibernate.cfg.xml (放到src目录下...
  • QQQQQQ654
  • QQQQQQ654
  • 2016年08月09日 20:09
  • 7377

hibernate实体映射之讲解

实体类与数据库之间存在某种映射关系,Hibernate依据这种映射关系完成数据的存取,因此映射关系的配置在Hibernate中是最关键的。Hibernate支持xml配置文件与@注解配置两种方式。xm...
  • bestone0213
  • bestone0213
  • 2015年09月13日 11:53
  • 1827

HIbernate实体类注解配置

一、类级别注解 1、@Entity(name="EntityName")  必须 name为可选,对应数据库中一的个表 2、@Table(name="",catalog="",schema="...
  • lzy331534013
  • lzy331534013
  • 2016年10月22日 12:29
  • 1545

MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

反向工程 逆向工程  开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事。MyEclipse提供简便的方法:反向数据库  步骤大致如下:  第一步:  window--...
  • qq_26222859
  • qq_26222859
  • 2016年01月15日 10:18
  • 734

hibernate创建实体类的类型详解

首先上两个实体类: package entity; import javax.persistence.Basic; import javax.persistence.Column; import ...
  • u014520745
  • u014520745
  • 2016年05月15日 13:52
  • 445
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:兔八哥笔记15(1):Hibernate中的父子关系
举报原因:
原因补充:

(最多只允许输入30个字)