2011-08-31 38 views
0

我有以下的POJOs:Hibernate的继承更新问题

@Entity 
@Table(name = "COMMUNICATION") 
@Audited 
public class CommunicationPojo 
    implements Serializable 
{ 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "TRANSMISSION_TYPE", nullable = false, unique = true) 
    private TransmissionTypePojo transmissionType; 
} 


@Entity 
@Table(name = "TRANSMISSION_TYPE") 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
@Audited 
public abstract class TransmissionTypePojo 
    implements Serializable 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
     private long id; 
    @OneToOne(mappedBy= "transmissionType") 
    private CommunicationPojo communication; 
} 


@Entity 
@Table(name = "TRANSMISSION_TYPE_AS2") 
@Audited 
public class TransmissionTypeAS2Pojo 
    extends TransmissionTypePojo 
    implements Serializable 
{} 

@Entity 
@Table(name = "TRANSMISSION_TYPE_MAIL") 
@Audited 
public class TransmissionTypeMailPojo 
    extends TransmissionTypePojo 
    implements Serializable 
{} 

如果,如果保存的通信实例与TRANSMISSION_TYPE_MAIL实例,改变了通信实例,以便它包含TRANSMISSION_TYPE_AS2实例,而不是一个TRANSMISSION_TYPE_MAIL实例,并更新通信中,hibernate会在TRANSMISSION_TYPE_AS2中插入一个条目,但不会删除TRANSMISSION_TYPE_MAIL中的旧条目。 是否有可能通过休眠来自动删除旧条目,还是必须自己删除它?

回答

0

您可以将orphanRemoval=true添加到communication的OneToOne注释中。

请注意,它与继承无关。

+0

我添加了orphanRemoval = true,但TRANSMISSION_TYPE_AS2条目仍然存在。 Hibernate不会对TRANSMISSION_TYPE_AS2表执行删除操作。我还将hashcode和equals函数添加到了transmission_type-pojo ... – Nephisto

+0

它应该起作用,至少如果您正在处理附属实体。如果你在分离的实体上完成所有这些操作,然后使用saveOrUpdate或合并,它将无法工作。请参阅https://hibernate.onjira.com/browse/HHH-5559。 –