Hibernate @OneToMany 合并错误

Hibernate @OneToMany merge error

我的申请遇到了以下问题:

我有一个 @OneToMany 关系,如上所示:

酒吧 class:

@Entity
public class Bar {

    @Id
    private Long id;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinTable(name = "bar_foo_relation",
        joinColumns = { @JoinColumn(name = "id", referencedColumnName = "bar_id") },
        inverseJoinColumns = { @JoinColumn(name = "id", referencedColumnName = "foo_id") } )
    private List<Foo> fooList;

    // Getters & Setters

}

福class:

@Entity
public class Foo {

    @Id
    private Long id;

    private String fooValue;

    // Getters & Setters

}

当我创建一个新的 Bar 实例时,填充了 fooList,如下所示:

{
  "id": null,
  "fooList": [
    {
      "id": null,
      "fooValue": "foo"
    },
    {
      "id": null,
      "fooValue": "foo"
    }
  ]
}

我打电话给manager.persist(bar),一切正常。

DB栏table:

行 | ID
----+----
01 | 01

DB bar_foo_relation table:

行 |bar_id|foo_id
----+------+------
01 | 01| 01
01 | 01| 02

DB foo table:

行 | id|foovalue
----+----+--------
01 | 01|富
02 | 02|富

但是,当我像这样放置新的 Foo 实例时:

{
  "id": 1,
  "fooList": [
    {
      "id": 1,
      "fooValue": "foo"
    },
    {
      "id": 2,
      "fooValue": "foo"
    },
    // New instance of Foo to persist
    {
      "id": null,
      "fooValue": "foo" // fooValue is setted
    },
    // New instance of Foo to persist
    {
      "id": null,
      "fooValue": "foo" // fooValue is setted
    }
  ]
}

并调用 manager.merge(bar) Foo 的新实例,这发生在 DB 上: 数据库栏 table:

行 | ID
----+----
01 | 01

DB bar_foo_relation table:

行 |bar_id|foo_id
----+------+------
01 | 01| 01
01 | 01| 02
01 | 01| 03 // Foo 的新实例被持久化并在此处被引用
01 | 01| 04 // Foo 的新实例被持久化并在此处被引用

DB foo table:

行 | id|foovalue
----+----+--------
01 | 01|富
02 | 02|富
02 | 03|null // 没有 foovalue 的 Foo 的新实例
02 | 04|null // 没有 foovalue 的 Foo 的新实例

新Foos的fooValeu列设置为null.

我不知道为什么会这样。有人可以向我解释一下吗?

我的环境是: Java 1.7 PostgreSQL 9.3 休眠 4.3.6.Final

尝试使用以下内容:

级联={CascadeType.PERSIST,CascadeType.MERGE}

我相信您看到的行为(虽然我不是 100% 确定)是当您对非持久化子对象调用合并时,实体管理器知道有关联的对象,但因为它们不是持久上下文 Foo 的默认构造函数在幕后调用。告诉您的父对象级联合并操作或手动保存子对象将阻止这种情况发生。