- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有两个实体:
@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
在持久化时都没有从 Article 中分配值,并且 Hibernate 在持久化 Article 后不关联它们。如何做到这一点?
编辑 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 关联 Article.id 中的 Locale.embed_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
最佳答案
我想问题是,您想保留两个空的语言环境。并且因为您没有为 id 字段使用生成器,所以语言环境具有相同的(空的)主键,因此无法持久化。
关于java - 与@JoinColumn 和@MapKeyColumn 保持@OneToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9954357/
我正在从 hibernate 4.2.5.Final 升级到 4.3.6.Final,4.3.6 hibernate 库导致 mysql 未知列类型异常。由于我无法完整展示我公司的生产代码,因此简化了
我有这个实体,并且想要查找具有相同属性集的任何实体。 @Entity public class PropertyResource { @ElementCollection @MapKe
我有一个双向 map 映射。阅读有效,但 Hibernate 不存储映射键列。当我 checkin 调试器时,一切都已按预期设置。 INSERT 查询是: insert into rel_custFi
这是我的sql表结构, create table TBL_DEPARTMENT_ONE( ID integer primary key generated always as identity
实体引用情况如下: Collision -> CollisionStatus CollisionWorkgroup(加入实体) -> Workgroup 碰撞.java: @Entity @Tabl
我有两个实体: @Entity Article { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Lo
我正在为实习创建一个 JPA 2.0 注释合规性工具包。现在,我想知道何时需要 @MapKeyTemporal 注释以及何时它是可选的... 我知道当您使用@MapKeyColumn 定义映射键的列时
我是一名优秀的程序员,十分优秀!