使用FetchType.EAGER关系合并对象会导致“FailedObject”

时间:2011-07-26 09:36:43

标签: jpa merge persistence fetch eager-loading

我有一个与另一个实体BP有关系的实体VM。这种关系引人瞩目。首先我加载一个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;

    // ...
}

1 个答案:

答案 0 :(得分:0)

我找到了出现此错误消息的原因:相关Bp实体的@Version带注释的数据库字段已初始化为“0”。显然,OpenJPA(1.2.3)无法应对零的实体版本。

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