如何调试“找到同一集合的两种表示形式”?
2022-09-03 14:31:51
我发现了几个关于这个问题的问题,但没有一个对问题的完整解释,以及如何调试它 - 答案都是轶事。
问题是,在 Play 1.2.4 JPA 测试中,当我使用模型时,我遇到了以下异常:save()
org.hibernate.HibernateException:找到同一集合的两种表示形式:模型。职位.项目
我想知道:
- 是否有与 Play 无关的一般问题文档?问题处于休眠状态,但Google在这方面的许多结果都在Play应用程序中。
- 有哪些基本的最佳做法可以避免此问题?
- 这是由游戏引起的吗?还是我做错了什么?
- 在我的特定情况下如何解决?
这是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;
}
还有我的持久性代码:
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();
顺便说一句,我尝试按照一个人的建议添加Play关联模块,但它似乎没有帮助。
我看到确实在某种意义上创建了表是重复的:
我既有一个表又有一个 ,其中两者都包含相似的字段:包含 a 和 ,而表包含(表示位置 id)、和 。因此,我理解某种意外的冗余是由我的模型定义创建的,但我并不真正了解如何解决它。person_position
position table
person_position
Person_id
positions_id
position
id
person_id
companies_id
我认为这可能与双向映射有关,但这里有一个分支,其中模型是单向的(我删除了一些反向引用) - 并且问题仍然存在。