我找到了severalquestionsabout这个,但没有一个完整地解释了问题,以及如何调试它 - 答案都是轶事。如何调试“找到两个相同集合的表示”?
的问题是,在播放1.2.4 JPA测试,我得到这个异常,当我save()
模型:
org.hibernate.HibernateException:找到相同 收集的两种表示:车型.Position.projects
我想知道:
- 有总的来说,联合国这一问题的文件与Play相关?问题在于休眠,但Google的很多结果都在Play应用中。
- 避免此问题的一些基本最佳实践是什么?
- 它是由Play引起的吗?或者我做错了什么?
- 如何解决在我的具体情况?
Here is a reproduction of the problem on 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 associations module作为一个人建议,以及简化版,它似乎帮助。
我看到的确是创建的表是重复的感觉:
我同时拥有person_position
表和position table
,其中都含有类似领域:person_position
包含Person_id
和positions_id
,而position
表包含id
(意思是位置id),person_id
和companies_id
。所以我明白某种意想不到的冗余是由我的模型定义创建的,但我并不真正了解如何解决它。
我认为这可能与双向映射有关,但这里是一个branch where the model is uni-directional(我删除了一些反向引用) - 问题仍然存在。
我的猜测 - 级联问题。你添加一个位置,并且该位置添加两个项目,那么joe.save()可能会导致两次添加位置。玩Cascade选项并回报:) – 2011-12-14 23:41:15
@KenEgozi - 做级联选项会如何生成我的表格?因为我在表结构本身中有一个重复...(我把细节放在问题中) – ripper234 2011-12-15 05:47:04
@KenEgozi - 通过升级休眠版本解决 - 请参阅我的答案。谢谢。 – ripper234 2011-12-15 14:11:40