【问题标题】:Merging an object with FetchType.EAGER relation leads to "FailedObject"合并具有 FetchType.EAGER 关系的对象会导致“FailedObject”
【发布时间】:2011-10-13 06:31:08
【问题描述】:

我有一个与另一个实体 BP 有关系的实体 VM。这种关系是急切的。首先我加载一个虚拟机。加载后,VM 在客户端被分离、序列化和更改。现在我想更新更改的实体,所以我使用 JPA 中的 EntityManager.merge() 方法。现在我从 OpenJPA 遇到以下错误:

“附加期间在持久字段“Vm.bp”中遇到新对象。但是,此字段不允许级联附加。将此字段的级联属性设置为 CascadeType.MERGE 或 CascadeType.ALL(JPA 注释)或“合并”或“全部”(JPA orm.xml)。您不能在没有级联的情况下附加对新对象的引用。”

为什么我必须将 Cascade.MERGE 添加到与另一个永远不会改变的实体的关系中?为什么 JPA 认为 BP 是一个新对象(“...无法附加对新对象的引用...”)? 使用 ManyToOne 关系时,我是否总是必须添加 Cascade.MERGE 才能更新实体,还是因为 EAGER 提取类型?

这是我的实体:

@Entity
@Table(name = "VM")
public class Vm extends BaseEntity implements Serializable {
    public static final long serialVersionUID = -8495541781540291902L;
    @Id
    @SequenceGenerator(name = "SeqVm", sequenceName = "SEQ_VM")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SeqVm")
    @Column(name = "ID")
    private Long id;
    // lots of other fields and relations

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "BP_ID")
    private Bp bp;

    // ...
}

【问题讨论】:

    标签: jpa merge persistence fetch eager-loading


    【解决方案1】:

    我找到了这个错误信息出现的原因:相关Bp实体的@Version注释的数据库字段被初始化为“0”。显然 OpenJPA (1.2.3) 无法处理零的实体版本。

    将版本设置为 1 解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2013-07-24
      相关资源
      最近更新 更多