天花费了n久时间在一个
hibernate的双键关联问题上好在最后问题还是解决了,不然我会睡不着觉的
问题:
我的数据库结构是这样的:
首先一开始我可以获得一个频道的channelId,我根据这个channelId得到一个首页区块的List,我在hibernate中配置homepagearea的加载方式,这样就可以通过homepage的到关联的栏目column(多对一关系),然后我还是使用hibernate的自动加载,取到column关联的专题subject(一对多关系)。
这时候问题出来了,由于column到subject的关联没有带channel信息,所以,我取到的subject实际上是一个column下所有的subject,而我期望的是要得到,一个homepagearea下根据channelId和columnId取得的subject.
解决思路:
希望通过hibernate直接建立homepage和subject的1对多关联关系
解决方法
首先我改变原来利用工具生成的hibernate配置文件和entitybean
先列出原来的homepagearea的配置文件
<!---->
<!---->
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping></hibernate-mapping>
<class></class> name="com.easou.wapsearch.channel.entity.CsHomepageArea"
table="CS_HOMEPAGE_AREA"
schema="WAPUSER"
lazy="true"
>
name="id"
type="long"
column="ID"
length="22"
>
<generator class="assigned"></generator>
name="createdBy"
type="long"
column="CREATED_BY"
length="22"
/>
name="createdDate"
type="timestamp"
column="CREATED_DATE"
length="7"
/>
name="isMore"
type="long"
column="IS_MORE"
length="22"
/>
name="name"
type="string"
column="NAME"
length="50"
/>
name="rowCount"
type="long"
column="ROW_COUNT"
length="22"
/>
name="showCount"
type="long"
column="SHOW_COUNT"
length="22"
/>
name="theOrder"
type="long"
column="THE_ORDER"
length="22"
/>
name="updateBy"
type="long"
column="UPDATE_BY"
length="22"
/>
name="updateDate"
type="timestamp"
column="UPDATE_DATE"
length="7"
/>
<!---->
<!---->
name="csChannel"
>
<column></column>
<!---->
name="csColumn"
>
<column></column>
为了让homepagearea和subject形成一种一对多的关系,我增加的一个
lazy="false" order-by="THE_ORDER" table="CS_SUBJECT"
outer-join="true">
<key></key>
<column name="CHANNEL_ID" index="CHANNEL_ID"></column>
<column name="COLUMN_ID" index="COLUMN_ID"></column>
class="com.easou.wapsearch.channel.entity.CsSubject" />
但是由于hibernate一对多映射的一端必须是主键,而且我这里需要关联的还是2列信息,所以我还必须要修改配置文件的主键设置
<composite-id unsaved-value="none" mapped="false"></composite-id>
<key-many-to-one name="csChannel" column="CHANNEL_ID"></key-many-to-one>
<key-many-to-one name="csColumn" column="COLUMN_ID"></key-many-to-one>
并且遮蔽掉原有的channel和column多对一关联关系,否则会报告重复错误
<!---->
这样hibernate才会在加载homepagearea时自动把subject的关联信息也加载进来了
最后的homepagearea配置文件
<!---->
<!---->
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping></hibernate-mapping>
<class name="com.easou.wapsearch.channel.entity.CsHomepageArea"></class> table="CS_HOMEPAGE_AREA" schema="WAPUSER" lazy="true">
<composite-id unsaved-value="none" mapped="false"></composite-id>
<key-many-to-one name="csChannel" column="CHANNEL_ID"></key-many-to-one>
<key-many-to-one name="csColumn" column="COLUMN_ID"></key-many-to-one>
<property type="long" name="createdBy" column="CREATED_BY"></property>
length="22" />
<property type="timestamp" name="createdDate"></property>
column="CREATED_DATE" length="7" />
<property type="long" name="isMore" column="IS_MORE"></property>
length="22" />
<property></property>
<property type="long" name="rowCount" column="ROW_COUNT"></property>
length="22" />
<property type="long" name="showCount" column="SHOW_COUNT"></property>
length="22" />
<property type="long" name="theOrder" column="THE_ORDER"></property>
length="22" />
<property type="long" name="updateBy" column="UPDATE_BY"></property>
length="22" />
<property type="timestamp" name="updateDate"></property>
column="UPDATE_DATE" length="7" />
<!---->
lazy="false" order-by="THE_ORDER" table="CS_SUBJECT"
outer-join="true">
<key></key>
<column name="CHANNEL_ID" index="CHANNEL_ID"></column>
<column name="COLUMN_ID" index="COLUMN_ID"></column>
class="com.easou.wapsearch.channel.entity.CsSubject" />
经验总结:
1、本来使用hibernate的加载策略就是为了把一些业务逻辑直接融合在数据库关系当中,但是由于自己逻辑没有考虑清楚造成了加载时信息的丢失(而且我觉得我的表结构有问题,不知有有没有dba给我指点一下问题)。
2、hibernate的一对多关联关系多端是1端是针对主键的,所以不论你是关联的是1列2列还是3列,它们都应该是你的1端的主键或者联合主键(其实一对一,多对一,多对多的原理也是相似的)。
参考资料:hibernate_reference(3.2)
分享到:
相关推荐
### Hibernate HQL 关联查询详解 #### 一、引言 在进行数据库操作时,关联查询是必不可少的一部分,尤其在处理复杂的数据结构时更是如此。Hibernate作为一种流行的Java持久层框架,提供了强大的对象关系映射(ORM...
hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...
一、Hibernate关联关系介绍 在Hibernate中,关联关系主要包括以下几种: 1. 一对一(OneToOne):一个实体对应另一个实体的唯一实例。 2. 一对多(OneToMany):一个实体可以与多个其他实体相关联。 3. 多对一...
hibernate关联查询 实例源码 java web 如果不明白hibernate关联查询不明白的可以看看,保证马上学会,注释,数据库都有,很简单易学的源码,谢谢下载!
总之,Hibernate的多对多关联映射是解决复杂关系数据库设计的关键技术之一。通过合理的配置和使用,开发者可以轻松管理实体之间的多对多关系,提高开发效率。理解并熟练掌握这部分知识对于提升Java企业级应用开发...
Hibernate4中映射关系图解。
**Hibernate实体关联速查表详解** Hibernate作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据库事务。本速查表旨在提供关于Hibernate实体...
本文将详细介绍这些关联配置以及如何解决可能出现的错误。 **一对一关联(OneToOne)**: 一对一关联意味着两个实体之间存在唯一的对应关系。在Hibernate中,可以通过`@OneToOne`注解来实现。例如,`Person`类可能与`...
【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...
本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...
本文将深入探讨“Hibernate自身关联一对多实例(树形结构)”这一主题,这在构建具有层次结构的数据模型时尤其常见,例如组织结构、地区树或者商品分类等。 首先,我们需要理解Hibernate的核心概念。Hibernate允许...
- 避免无限循环:当双向关联时,要注意避免无限递归问题,可以通过`@JsonIgnore`或`@JsonBackReference`和`@JsonManagedReference`注解解决。 关联映射在实际项目中的应用广泛,理解并熟练掌握这些映射方式对于优化...
**Hibernate数据关联映射** Hibernate 是一款强大的Java对象关系映射(ORM)框架,它允许开发者将数据库操作转化为对Java对象的操作,简化了数据库编程。在 Hibernate 中,数据关联映射是实现对象与数据库表之间...
Hibernate关联关系是Java持久化框架Hibernate中的核心概念,它允许我们在数据库中建立对象之间的关系映射,以便在程序中操作对象时,可以自动处理与数据库的交互。本篇将深入探讨Hibernate的四种主要关联关系:一对...
作者可能会讨论如何处理关联的懒加载和即时加载,以及可能遇到的问题和解决方案。 ### 实际应用 在实际开发中,一对一关系常用于那些逻辑上紧密耦合但又需要独立存储的数据模型,如用户个人信息和用户账户信息,...
总之,Hibernate关联关系是理解其工作原理的关键,它使得Java对象和数据库记录之间的映射变得简单。通过练习,你可以掌握如何配置和使用这些关系,以及如何进行相关的查询操作,从而提升你的开发效率和代码质量。...
在Java的持久化框架Hibernate中,数据关联技术是其核心特性之一,它使得对象关系映射(ORM)更加灵活和高效。本笔记将深入探讨Hibernate中的数据关联,特别是1:1、1:N和M:N这三种关联关系,以及如何通过POJO类和XML...
在Java的持久化框架Hibernate中,关联映射是数据库对象之间关系的一种体现,它使得ORM(对象关系映射)更加灵活。"Hibernate单向关联代码示例"是一个实用的学习资源,帮助开发者理解如何在实际项目中实现单向关联。...