`

Hibernate的Entit Manager数据值重复的问题

阅读更多
问题描述:
当使用Hibernate的Anotation来定义一个复杂对象时,有可能需要关联别的表,当该对象与关联的表的关系为一对多,或多对多时,即 Entity的属性值为数组或者集合,且上面加有 @org.hibernate.annotations.CollectionOfElements @OneToMany或者@ManyToMany标签时,Hibernate会把该属性当做一个包来处理, 示例代码:
@OneToMany(mappedBy="parent",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
 List<Child1> child1s = new LinkedList<Child1>(); @OneToMany(mappedBy="parent",cascade=CascadeType.ALL, fetch=FetchType.EAGER)
 List<Child2> child2s= new LinkedList<Child2>(); 

Hibernate在解析这个Entity的时候,可能会出现一些意外情况,有时会抛出“HibernateException: cannot simultaneously fetch multiple bags ”这样的异常,有时会出现数据项重复的情况,比方说,有如下的一个叫Parent的Entity, 它有2个属性Child1和Child2,数据库中的表结构如下:



当Hibernate在解析ID为122 的Parent 的时候, 会首先把与该Entity相关的数据全部获取出来,形成如下的表结构:


从上表中标红的字体,可以发现,虽然CHILD2表里面只有一行数据,但是却在数据中重复出现了2次,这就导致在child2s这个集合属性值里面有2条一模一样的数据。

解决方法:
1、为属性值添加Anotation @IndexColumn(name="child2_id") 以指定属性值关联表的unique ID,当Hibernate解析该属性值,会先查看是否已经加载过相同的属性值,这样就避免了相同数据的重复加载。

2、把属性值的类型修改为Set这样,就当Hibernate把数据添加到属性值的时候就自动去重了。

  • 大小: 15.8 KB
  • 大小: 21.4 KB
  • 大小: 17.6 KB
  • 大小: 34 KB
0
0
分享到:
评论

相关推荐

    MySql.Data.Entity.dll

    MySql.Data.Entit

    hypeGeo:用于构建位置感知插件的工具

    每当更新location元数据时,都会对元数据值进行地理编码,并将相应的坐标存储在启用几何的表中。 这允许减少开销,这是按到给定地理点的距离对实体进行排序或选择特定范围内的实体所必需的 当您第一次激活插件时,...

    system d'information des bass des donnees sous ACCESS

    - **Attributs des Entités** : Chaque entité possède des attributs qui sont ses caractéristiques spécifiques, comme le nom d’un client, le prix d’un produit, etc. ###### 2.2.2 Construction des ...

    用户合并

    此模块可帮助用户将重复的帐户合并在一起。 它使用挂钩系统,因此其他模块可以执行他们与用户之间的关系管理所需的一切。 具有正确权限的用户可以选择如何合并每个用户属性。 这包括合并字段,引用实体和所选用户...

    Cesium 中 实体类entity多种实例对象-实现点击事件

    在实际应用中,你可以根据需求自定义更多属性和方法,比如动态更新实体的位置、颜色,或者为点击事件添加更复杂的逻辑,如打开关联数据的详情页面等。结合Vue等前端框架,Cesium能更好地服务于Web GIS和3D可视化项目...

    IdentityServer3.Contrib.PowerShell:用于管理 Thinktecture IdentityServer3 的客户端和作用域的 PowerShell cmdlet 与实体框架一起保存

    这是尝试解决这个问题,直到有官方可以执行此任务。 您可以将此 PowerShell 模块包含在部署/安装包中、在脚本中使用或将其提供给 DevOps,以便他们可以偶尔维护客户端和范围。入门您需要最新版本的 PowerShell,...

    蔡氏电路matlab仿真代码-iOSTemplateProject:iOS模板项目

    matlab仿真代码iOS模板项目 1.信息: iOS项目的模板 型号:MVC 语言:Swift 3.x 作业系统:iOS 8.0以上 2.图书馆: 2.1。...MagicalRecord:对核心数据的支持 ...包含核心数据实体,DTO类的目录。...entit

    CourseOutline

    培训概述Accelebrate对ADO.NET实体框架的掌握培训教给开发人员如何使用Microsoft强大的对象关系映射(ORM... 使用最少的代码以托管方式访问数据应用实体框架支持的三个工作流程充分自动化地执行基本任务使用LINQ和Entit

    jbbp:基于 Java BerkeleyDB 的 Persister

    BerkeleyDB 是一个键值数据库,支持完整的 ACID 事务、DPL Java 访问、多线程模型但基于单进程、键控和顺序数据检索等。 然而,使用 BerkeleyDB 需要一些烦人的样板代码来设置生产环境,所以我编写了 JBBP,一个...

    Databases-Teamwork-2015:数据库– Telerik学院团队项目– 2015年10月

    已安装的Nuget软件包DocumentFormat.OpenXml.2.5 DotNetZip.1.9.6 EntityFramework.6.1.3 ExcelFile.net.1.1.1 mongocsharpdriver.2.0.1 ...6.8.6 MySql.Data.6.9.7 MySql.Data.Entities.6.8.3.0 MySql.Data.Entit

    candotti-blog:Sym在Symfony中创建博客项目

    去做 : [X] Creation du projet [X]初始化基础[X]实体文章,用户[X]Entitécatégorie [ ]通讯[X]角色,身份验证[X] CRUD文章[X]模板文章[X]主页[X]关于页面[ ]联系人页面[X]创作文章[ ]界面管理员[ ] Liker [ ]...

    projet_symfony

    php bin / console make:entity // PascalCase上的Nom de l'entité _多瑙河沿岸国家历史保护组织(Créationde la base dedonnée) PHP Bin /控制台学说:数据库:创建_ Connaitre les路线不适用者: PHP的斌/...

    dta-ra:Immobilienwirtschaft中的日期格式

    Entitäten 奥地利联邦政府机构 全素实体 格式 《格式》的设计者是Meldung。 Als Formatfürden Datenaustausch ist angedacht。 客户中心(应用程序和Web-Portale)的日期和日期中的Der Vorteil位置。 ...

    MI-banana-grabber

    name: 'Bezeichnung der Entität', (einmalig) kind: z.b. :'Character' | 'Ship' | 'item', url: 'URL TO FANDOMWIKI', appearance: [ 'MM1', 'MM2' ] }, [...] 某些孩子则具有某些其他特征...例如: { ...

    homeassistant-afvalwijzer:为荷兰废物收集者mijnafvalwijzer.nl和_或afvalstoffendienstkalender.nl提供传感器

    Afvalwijzer 与 , 和集成的组件。 该自定义组件动态创建sensor.afvalwijzer_ *项目。 对我个人而言,创建的项目是gft,restafval,paper,pmd和kerstbomen。 在Home Assistant的开发人员工具中的状态概述... - entit

    jpa:使用 Xtend 键入安全的 JPA 查询

    #Plugback JPA - 使用 Xtend 的类型安全 JPA 查询 Plugback JPA 是一个模块,允许您扩展 Java Persistence API 以使用类似 sql 的简洁和类型安全的语法查询您的数据库。 === ##你需要什么要使用... 一个 JPA Entit

    引擎:Oasis Engine是一个网络优先和移动优先的高性能实时开发平台

    ball: 图形-先进的2D + 3D图形引擎 :person_running: 动画-强大的动画系统 :bookmark_tabs: 脚本-使用TypeScript高效地编写逻辑用法// Create engine by passing in the HTMLCanvasElement name and get root entit

    ha-proof-dashcam-integration:HACS集成到proof.co.il行车记录仪

    ha-proof-dashcam集成 HACS集成到 dashcam 如果您无法在HACS中找到集成,则只需将此仓库添加为自定义仓库即可。 用法: configuration.yaml: proof : audi : username : !secret proof_username ... - entit

    cma_rails_app:示例 Rails 应用程序,用于演示使用 Content Management Api Rubygem 创建内容

    Rails 示例应用程序 描述 示例 Rails 应用程序演示使用创建。 安装 克隆存储库并运行 bundle install 用法 ... 第一次使用该应用程序时,系统会要求您输入 Contentful ACCESS_TOKEN和ORGANIZATION_... Contentful :: Entit

Global site tag (gtag.js) - Google Analytics