【发布时间】:2012-04-14 19:27:09
【问题描述】:
我有两个实体:
@Entity
Article {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name="embed_id", referencedColumnName="id")
@MapKeyColumn(name = "language")
@MapKeyEnumerated(EnumType.ORDINAL)
private Map<Language, Locale> locales;
Article() {
locales.put(Language.CS, new Locale());
locales.put(Language.EN, new Locale());
}
}
@Entity
Locale {
@Id
private Long embed_id;
@Id
private Language language;
@Column(length = 256)
private String name;
}
感谢构造函数,我可以确保,一旦实例化 Article,就会有两个 Locales(带有 CascadeType.ALL)与之关联。
当我试图坚持这样的实体时,问题就来了——我得到了:
javax.persistence.EntityExistsException:
a different object with the same identifier value was already associated
with the session: org...Locale#org...Locale@2bfdsc64
问题是embed_id和language在持久化时都没有从文章中赋值,并且Hibernate在持久化文章后不会关联它们。如何做到这一点?
编辑 1:
我检查了当手动设置embed_id 和language 时,一切正常。我只需要告诉Hibernate,根据@OneToMany关系设置@JoinColumn和@MapKeyColumn的值。
编辑 2:
MapKeyColumn 的问题有一个简单的解决方案:
public void addLocale(Language l, Locale locale) {
locale.setLanguage(l);
this.locales.put(l);
}
但我仍然无法告诉 hibernate 将 Locale.embed_id 与 Article.id 相关联。
编辑 3:
我可以看到文章的ID是正确生成的,但是它没有放在语言环境中:
DEBUG org.hibernate.event.internal.AbstractSaveEventListener -
Generated identifier: 87, using strategy: org.hibernate.id.SequenceGenerator
DEBUG org.hibernate.event.internal.AbstractSaveEventListener -
Generated identifier: component[language,embedId]{language=0, embedId=null}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator
DEBUG org.hibernate.event.internal.AbstractSaveEventListener -
Generated identifier: component[language,embedId]{language=1, embedId=null}, using strategy: org.hibernate.id.CompositeNestedGeneratedValueGenerator
【问题讨论】:
标签: java hibernate jpa persistence