java - 与@JoinColumn 和@MapKeyColumn 保持@OneToMany 关系

标签 java hibernate jpa persistence

我有两个实体:

@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_idlanguage 在持久化时都没有从 Article 中分配值,并且 Hibernate 在持久化 Article 后不关联它们。如何做到这一点?

编辑 1:

我检查过,当手动设置 embed_idlanguage 时,一切正常。我只需要告诉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/

相关文章:

java - 如何执行前 10 个 JPA 存储库

Java JSP - 删除 .DS_Store 并显示正确的文件夹名称

java - Android 布局中的 DatePicker 导致 stackoverflow

java - 将列表中的*所有*项目与 Hibernate 标准相匹配

json - 如何使用 Hibernate 映射 postgresql json 数据类型?

java - 建议使用 JSF 、 EJB 3.0 的应用程序设计模式

java - timeOut 是做什么的(使用 Jsoup 进行 html 解析)

java - 订购具有重复字符串的 ArrayList

java - 如何从 spring mvc 和 hibernate 中的 json 响应获取日期格式响应而不是毫秒

java - Spring MVC 域对象处理最佳实践