如何调试“找到同一集合的两个表示”?

2024-01-04

我已经发现several https://stackoverflow.com/questions/6033314/use-map-as-property-of-model-in-play 问题 https://stackoverflow.com/questions/7002129/play-framework-and-the-use-of-collections-in-model-classes about https://stackoverflow.com/questions/8318692/hibernateexception-found-two-representations-of-same-collection这个,但没有一个对问题以及如何调试它的完整解释 - 答案都是轶事。

问题是,在 Play 1.2.4 JPA 测试中,当我save()一个模型:

org.hibernate.HibernateException:找到相同的两个表示 集合:models.Position.projects

我想知道:

  1. 是否有与 Play 无关的一般问题的文档?问题出在休眠状态,但 Google 的很多结果都在 Play 应用程序中。
  2. 避免此问题的一些基本最佳实践有哪些?
  3. 是玩游戏造成的吗?或者我做错了什么?
  4. 针对我的具体情况如何解决?

这是 github 上问题的重现 https://github.com/ripper234/play-two-representation-same-collection。我有四个实体:

@Entity
public class Person extends Model {
    public String name;

    @OneToMany(cascade = CascadeType.ALL)
    public List<Position> positions;
}


@Entity
public class Position extends Model {
    public Position(){}
    public Position(Company companies) {
        this.companies = companies;
        this.projects = new ArrayList<Project>();
    }

    @OneToOne
    public Company companies;

    @ManyToOne
    public Person person;

    @OneToMany
    public List<Project> projects;
}

@Entity
public class Company extends Model {
    public String name;
}

@Entity
public class Project extends Model {
    public Project(){}
    public Project(String field, String status){
        this.theField = field;
        this.status = status;
    }

    @ManyToOne
    public Position position;

    public String theField;
    public String status;
}

和我的持久性代码:

Company facebook = new Company();
facebook.name = "Facebook";
facebook.save();
Company twitter = new Company();
twitter.name = "Twitter";
twitter.save();

Person joe = new Person();
joe.name = "Joe";
joe.save();

joe.positions = new ArrayList<Position>();

Position joeAtFacebook = new Position(facebook);
joeAtFacebook.projects.add(new Project("Stream", "Architect"));
joeAtFacebook.projects.add(new Project("Messages", "Lead QA"));
joe.positions.add(joeAtFacebook);

Position joeAtTwitter = new Position(twitter);
joeAtTwitter.projects.add(new Project("Steal stuff from Facebook", "CEO"));
joe.positions.add(joeAtTwitter);
joe.save();

顺便说一句,我尝试添加玩关联模块 http://www.playframework.org/modules/associations-1.0.1/home正如一个人所建议的,这似乎没有帮助。

我发现创建的表在某种意义上确实是重复的:

我有两个person_position表和一个position table,其中两者都包含相似的字段:person_position包含一个Person_id and positions_id,而position表包含id(意思是位置ID),person_id, and companies_id。所以我知道我的模型定义创建了某种意外的冗余,但我并不真正了解如何解决它。

我认为这可能与双向映射有关,但这是一个模型是单向的分支 https://github.com/ripper234/play-two-representation-same-collection/tree/no-bidirectional(我删除了一些反向引用) - 但问题仍然发生。


据我所知,该错误是由以下任意组合引起的:

  • 缺乏/缺失mappedBy参数开启@OneToMany注释。此参数应接收目标模型中引用回此模型的字段的名称。
  • 旧的 hibernate - Play 1.2.4 附带 hibernate 3.6.1 ...升级到 3.6.8 似乎解决了另一个此类问题(只需将以下内容添加到 dependency.yml 中,然后播放 deps)

- org.hibernate -> hibernate-core 3.6.8.Final:

force: true

对我来说,上述步骤解决了问题.

它实际上是休眠中的一个错误,因为它是在持久化对象时抛出的,而它实际上意味着在创建模式时应该检测到的“设计时”问题。

我用来调试的步骤:

  • 编写了一个重现问题的测试
  • 添加了关联模块 http://www.playframework.org/modules/associations- 我不确定它是否解决了部分问题,或者使问题变得更糟。
  • 通过hibernate代码进行调试,并意识到这可能表明hibernate问题,而不是用户/配置错误。
  • 注意到hibernate在3.6.1之后有相当多的bug修复版本,决定试试运气并升级。
  • 同样重要的是,清理 tmp 文件夹不会有什么坏处 - 在那里播放缓存编译的 jar,并且在升级 hibernate 版本等重大更改之后,清理它可能是值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调试“找到同一集合的两个表示”? 的相关文章

随机推荐

  • PowerShell 舍入和格式浮点到最多 2 位小数?

    我发现了很多东西可以将浮点数格式化为常见的已知数字 但是如何将浮点数格式化为最多 2 位小数 但前提是需要小数 例子 1 11 not 1 111 1 12 it was 1 116 round up 1 1 not 1 10 1 not
  • 逐行比较 2 个数据帧的随时间分析

    这是我正在使用的数据框的一小部分 以供参考 https i stack imgur com 7fdwL jpg我正在 R 中使用一个数据框 MG53 HanLab 其中有一列时间 几列名称为 MG53 的列 几列名称为 F2 的列以及几列名
  • 有没有办法让 git 忽略整个分支?

    这可能违背了 git 的设计理念 但是 在我的组织中 我不断地删除数千个开发人员分支 例如Dev
  • std 函数 std::_Rb_tree_rebalance_for_erase () 中的分段错误

    请注意未来的读者 不出所料 错误出现在我的代码中 而不是 std Rb tree rebalance for erase 我对编程有点陌生 不确定如何处理似乎来自 std 函数的分段错误 我希望我做了一些愚蠢的事情 即滥用容器 因为我不知道
  • ValidationMessages.properties 文件之间的冲突

    我习惯将所有验证约束收集在一个公共库中 在罐子的根部我放了一个ValidationMessages it properties文件 一切正常 如果我将此库放入 jsf 2 war 项目中 所有验证消息都会正确显示 但是 如果我再放一个 就会
  • JS/CSS 幻灯片效果适用于小提琴,不适用于 html

    我的第一个问题是小提琴不工作 现在它可以工作了 但是如果我将它复制到括号文件中 它就不再工作了 我确实包含了放置在外部资源中的链接 这是小提琴 https jsfiddle net wtbdxx2b 6 https jsfiddle net
  • Python 更新 SQL 数据库时出错

    我有一些看起来像这样的 python 代码 import pypyodbc import pandas as pd home c SQL df pd read sql query sql4 conn3 for y1 in range 0 k
  • 获取已安装服务的版本信息?

    我想以编程方式检查是否安装了最新版本的 Windows 服务 我有 var ctl ServiceController GetServices Where s gt s ServiceName MyService FirstOrDefaul
  • PHP 执行时显示加载图像

    我想在 php 脚本执行时显示加载图像 我读过关于如何做到这一点的不同答案 但大多数人都说我应该有一个单独的 php 页面 但是我使用单页来显示行 那么如何才能显示加载图像 我用来获取数据的选择查询示例 stmt mydb gt prepa
  • 在长字符串中插入换行符——自动换行

    这是我编写的一个函数 用于将长字符串分成不长于给定长度的行 strBreakInLines lt function s breakAt 90 prepend words lt unlist strsplit s if length word
  • android - 启动另一个应用程序的活动以获取其结果

    我有两个应用程序 A 和 B 我从 A 启动 B 以获取结果 使用以下代码 Intent fmIntent getPackageManager getLaunchIntentForPackage com example B fmIntent
  • BLE 设备在完美工作数周后停止与 Android 连接

    我有一台配备 Blue Gecko BLE 的设备 在各种 Android 手机和平板电脑上一切似乎都工作正常 连接 数据传输以及断开连接后重新连接 注意 我们不配对我们的设备 它只是连接 并且我们不使用自动连接 现在的问题是 有时某些设备
  • 程序何时会受益于预取和非临时加载/存储?

    我用这个做了测试 for i32 i 0 i lt 0x800000 i Hopefully this can disable hardware prefetch i32 k i 997 0x7FFFFF 0x40 mm prefetch
  • VIM宏编辑

    假设我录制了一个很长的宏 其中包含许多命令和特殊字符 我很可能在某个地方犯了错误 如何编辑宏 更正错误并再次保存 例如 我想复制一行 然后将其中的数字加一 这个宏是 yyp d
  • dask dataframe groupby 导致一个分区内存问题

    我正在将 64 个压缩的 csv 文件 可能是 70 80 GB 读入一个 dask 数据帧 然后使用聚合运行 groupby 这项工作从未完成 因为显然 groupby 创建了一个只有一个分区的数据框 这个帖子 https stackov
  • C++:push_back(new Object()) 是内存泄漏吗?

    下面的C 代码是否存在内存泄漏 list push back new String hi 据我了解 任何 std 集合 容器中的 push back 总是会生成一个副本 因此 如果复制了新字符串 则没有任何东西可以删除新字符串 对吧 因为在
  • PHP 中的无效参数

    当我在 Wamp 中运行脚本时 我收到以下第 17 行和第 21 行的警告通知 这告诉我什么以及可以 应该做什么来解决该问题 Warning 为 C wamp www eCardScript ecard lib php 中的 foreach
  • 初始化警告:服务 myservice 需要定义 SELinux 域。请修复

    我想在启动时执行可执行文件在 Android 5 1 的目标板上所以我将其添加到 init rc 中 on boot start myservice service myservice system bin myservice class
  • 为什么这个 Clojure 程序这么慢?怎样才能让它跑得快呢?

    Here https stackoverflow com questions 6216888 is nodejs faster than clojure它清楚地解释了如何优化处理原始值的 Clojure 程序 使用类型注释和未经检查的数学
  • 如何调试“找到同一集合的两个表示”?

    我已经发现several https stackoverflow com questions 6033314 use map as property of model in play 问题 https stackoverflow com q