`
seethemoon
  • 浏览: 48353 次
  • 性别: Icon_minigender_1
  • 来自: 钟祥
社区版块
存档分类
最新评论

Hibernate双主键,多表关联操作相关知识

阅读更多

 

Hibernate双主键,多表关联操作相关知识

 


对于web项目一般避免用双主键或者多表关联的操作,但是对于编码人员来说,只要数据库设计师设计了数据库,必须按照数据库的方式进行编码,否则对于数据库维护方面就不太方便。
当然加入了双主键和多表关联的操作后,对于编码人员来说是个痛苦的事情。因为不管在PO的配置文件中还是在VO的action中都不会有一个完美的解决。
现在将我在项目开发中所遇到的关于双主键以及多表关联的操作总结下,希望大家能够一起给出意见:
1.   首先是PO文件的映射,
我想大家都会了吧,但是需要注意的是对于双主键来说,Hibernate会生成一个专门的主键Bean来存放主Bean所对应的主键。例如我的连个表是:
PetInfor(pid(number),itemid(varchar2),petname(varchar2),cateid(number),price(double)……)
Primary Key (pid,itemid)双主键,foreignkey(cateid)外键 关联。
Cate(cateid(number),catename(varchar2),…..)
则由此在po里映射的Bean有三个:Petinfor.java;  PetinforId.java;  Cate.java;
其中的某些属性:
/*************************petinfor.java*********************/

 

private PetinforId id;

 


 

    private Cate cate;

 


 

    private String name;

 


 

    private Double norprice;

 


 

    private Double vipprice;

 


 

 


 

    // Constructors

 


 

 


 

    /** default constructor */

 


 

    public Petinfor() {

 


 

    }

 


 

 


 

    /** minimal constructor */

 


 

    public Petinfor(PetinforId id, String name) {

 


 

        this.id = id;

 


 

        this.name = name;

 


 

    }

 


 

 


 

    /** full constructor */

 


 

    public Petinfor(PetinforId id, Cate cate, String name, Double norprice,

 


 

            Double vipprice) {

 


 

        this.id = id;

 


 

        this.cate = cate;

 


 

        this.name = name;

 


 

        this.norprice = norprice;

 


 

        this.vipprice = vipprice;

 


    }
/*************************petinforId.java*********************/

 

private String itemid;

 


 

    private Long pid;

 


 

 


 

    // Constructors

 


 

 


 

    /** default constructor */

 


 

    public PetinforId() {

 


 

    }

 


 

 


 

    /** full constructor */

 


 

    public PetinforId(String itemid, Long pid) {

 


 

        this.itemid = itemid;

 


 

        this.pid = pid;

 


    }
/*************************Cate.java*********************/
这个文件就不啰嗦了在这里。
我们没必要仔细追究Bean文件是怎样生成或使用的,很多人的习惯是将Bean里不符合要求的属性修改,这个习惯非常好,因为对于Hibernate操作而言,数据库设计和文件映射上的属性是不一样的。
有了双主键,是不是多了一个pojo文件呢?不会,主键bean只是作为主键标志而存在,并没有多一个pojo文件,而在配置文件中就关联了复合主键的属性。如下:

 

<composite-id name="id" class="com.hb.po.PetinforId">

 


 

            <key-property name="itemid" type="java.lang.String">

 


 

                <column name="ITEMID" length="10" />

 


 

            </key-property>

 


 

            <key-property name="pid" type="java.lang.Long">

 


 

                <column name="PID" precision="22" scale="0" />

 


 

            </key-property>

 


 

        </composite-id>

 


 

        <many-to-one name="cate" class="com.hb.po.Cate" fetch="select" lazy="false">

 


 

            <column name="CATEID" precision="22" scale="0" />

 


        </many-to-one>

从配置文件可以看出复合主键的配置方法和多对一映射的配置方法。
在这里要非常注意Hibernate lazy的设置。

 

Hibernate Lazy 问题, Spring 中引入了 OpenSessionInViewInterceptor, 这样虽然解决了页面上的 Lazy Load 问题,却增加了各层之间的偶合性,
如果一个 Lazy 的 Collection 在页面上可以被正确的 load, 但是如果请求不是来自于 HttpServletRequest (比如在 TestCase 或 Service 中希望获取 lazy 的属性),
一般会导致两种错误:

 


 

代码

 


 

1. 设置了 lazy = "true"   

 


 

会导致 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of xxx: xxx - no session or session was closed   

 


 

2. 设置里 lazy = "false"   

 


会导致 org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed   

我这里设置的是lazy=“false”方便将Cate Bean中的相关属性用到工程中。
这个就是PO的相关东西,我会继续将po的相关细化并贴出来共享。下面是其他的操作。

<B style="mso-bidi-font-weight: normal">
分享到:
评论

相关推荐

    hibernate 多表关联 中间表

    通过以上步骤,我们就能在Hibernate中有效地管理多对多关联,并利用中间表实现复杂的数据操作。理解并熟练掌握这些知识,对于任何Java开发人员来说都是非常有价值的,特别是在大型企业级应用中,这种关联映射的使用...

    hibernate一对一主键关联(注解版)

    本知识点主要讲解的是使用Hibernate实现一对一主键关联(Primary Key Join)的方式,通过注解进行配置。 一对一的关联在数据库设计中并不常见,但当两个实体之间确实存在一对一的关系时,如用户和其个人资料,这种...

    hibernate双向多对多关联映射(XML)

    3. **中间表的处理**:在多对多关联中,Hibernate默认会生成一个中间表来保存两个实体的主键。如果你需要自定义中间表,可以通过`@JoinTable`注解或在XML中添加`&lt;join&gt;`元素来指定。 4. **操作关联关系**:在代码中...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    Hibernate关联映射

    一对一主键关联是通过共享主键实现的,这意味着两个实体类共用同一个主键。在这种情况下,被引用的实体类(如 Address)不再有自己的独立主键生成策略,而是依赖于引用它的实体类(如 Person)生成主键。在 ...

    Hibernate多对多关联关系demo

    本示例"Hibernate多对多关联关系demo"将深入探讨如何在实际开发中设置和操作这种关系。我们将探讨以下关键知识点: 1. **映射配置**: 在Hibernate中,多对多关联关系通过`&lt;many-to-many&gt;`标签来实现。你需要在两...

    Hibernate基于外键的一对多单向关联

    "product.sql" 这个文件可能是数据库脚本,包含了创建商品表的SQL语句,可能包括外键约束,用于演示或测试 Hibernate 的一对多关联配置。 **详细知识点:** 1. **Hibernate框架**:Hibernate是一个开源的对象关系...

    hibernate一对一关联关系

    - **主键关联**:通过主键进行关联,即一方的主键作为另一方的外键。这种方式要求关联的两方具有相同的主键类型。 - **外键关联**:通过额外的外键字段进行关联,通常需要指定`@JoinColumn`注解。 4. **级联操作*...

    hibernate基础 二 关联映射 级联操作

    - **主键关联**:较少使用,通常涉及复杂的表结构设计。 ##### 示例代码 ```java // 定义一对多关系 public class Customer { private Set&lt;Order&gt; orders = new HashSet(); } public class Order { private ...

    hibernate一对一之唯一外键关联(双向关联)

    - 虽然一对一关联提供了便利,但过多的一对一关联可能会影响性能,因为每次查询可能涉及多个表,增加数据库访问的复杂性。因此,应谨慎设计实体间的关系。 8. **实例应用** - 在实际项目中,一对一关联常用于用户...

    hibernate 一对一双向带关联表映射练习

    在IT领域,尤其是在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate 一对一双向带关联表映射”的概念及其实践,结合提供的资源...

    用hibernate操作多表的例子

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式处理数据库操作,极大...实践是检验理论的最好方式,动手尝试这个多表操作的例子,将有助于巩固你的Hibernate知识。

    hibernate 多对多操作

    标题“hibernate 多对多操作”表明了本文将探讨的是在Java编程中,使用Hibernate框架处理数据库中的多对多关联关系。Hibernate是Java领域广泛使用的对象关系映射(ORM)工具,它允许开发者用面向对象的方式处理...

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...

    基于注解的关联关系Hibernate

    在这个“基于注解的关联关系Hibernate”的主题中,我们将深入探讨如何使用Hibernate的注解来配置不同类型的关联关系,包括一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-...

    Hibernate学习笔记

    复合主键关联映射则是处理具有多个字段作为主键的表与对象之间的映射。 通过理解这些知识点,开发者可以更有效地利用Hibernate框架来开发复杂的企业级应用,处理数据持久化以及对象和关系数据库之间的映射。...

    Hibernate_实体关联关系映射--学习总结

    - **多对多连接表关联**:多对多关系通常通过一个连接表来实现,连接表中包含两个外键,分别指向相关联的两个实体的主键。 #### 映射关系的方向 - **单向关联**:实体间的关联关系只在一个实体中体现。 - **双向...

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关系可以通过两种方式实现:外键关联和主键关联。本教程重点讨论的是外键关联,这意味着一方的表将包含指向另一方表的外键。双向关联意味着两个实体类都可以直接访问彼此。 接下来,我们将...

Global site tag (gtag.js) - Google Analytics