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

rip*_*234 14 java orm hibernate jpa playframework

我已经找到了几个 关于这个的问题 ,但没有一个问题的完整解释,以及如何调试它 - 答案都是轶事.

问题是在Play 1.2.4 JPA测试中,我在save()模型中遇到此异常:

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

我想知道:

  1. 是否有关于此问题的文档,与Play无关?这个问题处于休眠状态,但很多Google上的搜索结果都在Play应用中.
  2. 有哪些基本的最佳做法可以避免这个问题?
  3. 它是由Play引起的吗?或者我做错了什么?
  4. 如何解决我的具体情况?

这是github上问题的再现.我有四个实体:

@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;
}
Run Code Online (Sandbox Code Playgroud)

我的持久性代码:

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();
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我已经尝试过添加Play关联模块作为一个人的建议,它似乎没有帮助.

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

我有一个person_position表和一个position table,两个都包含类似的字段:person_position包含a Person_idpositions_id,而position表包含id(意思是位置ID)person_id,和companies_id.所以我理解我的模型定义会创建某种非预期的冗余,但我真的不明白如何解决它.

我认为这可能与双向映射有关,但这里是模型是单向分支(我删除了一些反向引用) - 问题仍然存在.

rip*_*234 9

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

  • 缺少/缺少注释mappedBy参数@OneToMany.此参数应接收目标模型中引用该模型的字段的名称.
  • 旧的hibernate - 播放1.2.4附带hibernate 3.6.1 ...升级到3.6.8似乎解决了另一个这样的问题(只需将以下内容添加到dependencies.yml,并播放deps)

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

force: true

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

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

我用来调试的步骤:

  • 写了一个重现问题的测试
  • 添加了关联模块 - 我不确定它是否解决了问题的一部分,或者使问题变得更糟.
  • 通过hibernate代码调试,并意识到这可能表示一个休眠问题,而不是用户/配置错误.
  • 注意到hibernate在3.6.1之后有相当多的bugfix版本,并决定试试运气和升级.
  • 同样重要的是,清理tmp文件夹不会受到影响 - 在那里缓存已编译的jar文件,并且在像升级hibernate版本之类的重大更改之后,清理它可能是值得的.


emt*_*t14 7

  尝试

        @OneToMany(mappedBy="position")
        public List<Project> projects;
Run Code Online (Sandbox Code Playgroud)