如何调试“找到两个相同集合的表示”? [英] How to debug "Found two representations of same collection"?
问题描述
我找到了几个 问题 about ,但没有一个完整地解释了问题,以及如何调试它 - 答案都是轶事。 / p>
问题是在Play 1.2.4 JPA测试中,当我 save()
一个模型:
org.hibernate.HibernateException:找到两个相同的表示
集合:models.Position.projects p>
我想知道:
- 一般来说,这个问题的文档与Play无关?问题出现在休眠状态,但很多Google的结果都在Play应用程序中。
- 避免此问题的一些基本最佳实践是什么?
- 是否由Play引起?或者我做错了什么?
- 如何解决我的具体情况?
下面是github上的问题复制。我有四个实体:
@Entity
public class Person extends Model {
public String name;
@OneToMany(cascade = CascadeType.ALL)
public List< Position>位置;
$实际
公共类位置延伸模型{
public Position(){}
public Position(公司公司){
this.companies =公司;
this.projects = new ArrayList< Project>();
}
@OneToOne
上市公司公司;
@ManyToOne
public Person person;
@OneToMany
public List< Project>项目;
}
@实体
公共类公司扩展模型{
public String name;
$ b $实体
公共类项目扩展模型{
public Project(){}
public Project(String field,String status){
this.theField = field;
this.status = status;
}
@ManyToOne
公共职位;
public String theField;
公共字符串状态;
}
以及我的持久性代码:
公司Facebook =新公司();
facebook.name =Facebook;
facebook.save();
公司twitter =新公司();
twitter.name =Twitter;
twitter.save();
Person joe = new Person();
joe.name =Joe;
joe.save();
joe.positions = new ArrayList< Position>();
位置joeAtFacebook =新位置(脸书);
joeAtFacebook.projects.add(新建项目(Stream,Architect));
joeAtFacebook.projects.add(新项目(Messages,Lead QA));
joe.positions.add(joeAtFacebook);
位置joeAtTwitter =新位置(推特);
joeAtTwitter.projects.add(新项目(从Facebook窃取东西,CEO));
joe.positions.add(joeAtTwitter);
joe.save();
顺便说一句,我尝试添加 Play associations module 作为一个人的建议,它似乎没有帮助。
我看到确实创建的表在某种意义上是重复的:
我有一个 person_position
表和一个位置表
,其中都包含相似的字段: person_position
包含 Person_id
和 positions_id
,而位置
表包含 id
(表示位置id), person_id
和 companies_id
。所以我明白某种意想不到的冗余是由我的模型定义创建的,但我并不真正了解如何解决它。
我认为这可能与双向映射有关,但这里是模型是单向的分支(我删除了一些反向引用) - 问题仍然存在。
据我所知,错误是由以下任何组合引起的:
- 在
@OneToMany
注释中缺少/缺少mappedBy
参数。此参数应接收目标模型中引用该模型的字段的名称。 - 旧的休眠 - Play 1.2.4随附hibernate 3.6.1 ...升级到3.6 .8似乎解决了另一个这样的问题(只需将以下内容添加到dependencies.yml,并发挥重要作用)
- org.hibernate - > hibernate-core 3.6.8.Final:
force:true
对于我来说,上述步骤解决了这个问题。
它实际上是hibernate中的一个bug,因为它在持久化对象时被抛出,而实际上这意味着创建模式时应该检测到的设计时间问题。
我用来调试的步骤: I have found several questions about this, but none with a complete explaintation of the problem, and how to debug it - the answers are all anecdotal. The problem is that in a Play 1.2.4 JPA test, I'm getting this exception when I org.hibernate.HibernateException: Found two representations of same
collection: models.Position.projects I would like to know: Here is a reproduction of the problem on github. I have four entities: And my persistence code: BTW, I've tried adding the Play associations module as one person suggested, and it does't seem to help. I see that indeed that tables that are created are duplicate in a sense: I have both a I thought this might be related to bi-directional mappings, but here is a branch where the model is uni-directional (I removed some back-references) - and the problem still occurs. As far as I've been able to tell, the error is caused by any combination of: For me, the above steps solved the issue. It is in fact a bug in hibernate, because it is thrown when persisting objects, while it actually implies a "design time" problem that should be detected when creating the schema. Steps I used to debug: 这篇关于如何调试“找到两个相同集合的表示”?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
save()
a model:
@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();
person_position
table and a position table
, where both contain similar fields: person_position
contains a Person_id
and positions_id
, while the position
table contain id
(meaning position id), person_id
, and companies_id
. So I understand some kind of unintended redundancy is created by my model definition, but I don't really understand how to solve it.
mappedBy
parameter on @OneToMany
annotations. This parameter should receive the name of the field in the target model that refers back to this model.- org.hibernate -> hibernate-core 3.6.8.Final:
force: true