在Hibernate 4中删除期间导致TransientObjectException的原因是什么?

时间:2013-07-30 03:03:01

标签: hibernate jpa

我正在尝试从我的应用程序中删除一个实体,但我遇到了一些错误。

实体如下所示:

ClinicInfo

@Entity
@Table
public class ClinicInfo extends PersistentObject {

    private static final long serialVersionUID = -3352666863795986217L;

    @ManyToOne
    @JoinColumn(name="appTimezoneId")
    @NotNull
    private AppTimeZone appTimeZone;
    ...
    ...
    ...
    ...
}

AppTimeZone

@Entity
@Table
public class AppTimeZone extends PersistentObject {

    private static final long serialVersionUID = 212088957599604285L;

    @Column(nullable = false, unique = true)
    @NotEmpty
    private String zoneID;
    ...
    ...
}
在这种情况下,

PersistentObject包含ID和版本。

每当我尝试删除clinicInfo时,都会收到以下错误:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.myapp.entity.AppTimeZone
    at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:249)
    at org.hibernate.type.EntityType.getIdentifier(EntityType.java:459)
    at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:275)
    at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:286)
    at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294)

ClinicInfo删除期间,我只设置了AppTimeZone对象的ID。

现在,为什么Hibernate会检查AppTimeZone是否脏了?

我的目标只是删除ClinicInfo

1 个答案:

答案 0 :(得分:1)

很可能你的实体对象处于分离状态,你无法删除它。

您只能删除持久对象。如果您有一个分离的对象,则需要首先通过调用merge()

使其持久化