2011-08-31 112 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。 –