2016-07-28 42 views
0

搜索答案後,我看到了@PrivateOwner註釋,但它不能解決我的問題。EclipseLink如何從ManyToOne關係中的「一面」中刪除孤兒實體

我使用的EclipseLink

這裏的問題: 我有2個與1相關實體:N雙向關係。

ComponentEntity一個可以與一個TransferDetailsEntity

TransfertDetailsEntity涉及一個或多個ComponentEntity

我想實現的是:當我刪除引用TransfertDetails的最後一個Component時,應刪除此TransfertDetails。 如果我將最後一個引用更改爲TransfertDetails,則相同。

簡而言之:只要TransfertDetails沒有被任何組件引用,它應該被刪除。

作爲一種變通方法我把這種方法:

@Override 
public void removeOrphanTransfer() { 
    for (TransferDetailsEntity transfer : transferDetailsRepository.findAll()) { 
     if (transfer.getComponents().isEmpty()) { 
      transferDetailsRepository.delete(transfer); 
     } 
    } 
} 

這一工程,但因爲它在整個表中搜索它不是真的有效。這是相當難看......

這裏是實體(簡化)代碼:

TransfertDetailsEntity:

@Entity 
@Table(name = TransferDetailsEntity.TABLE_NAME) 
@Getter 
@Setter 
@NoArgsConstructor 
public class TransferDetailsEntity extends AbstractEntity { 

    [...] 
    @Id 
    @Column(name = ID, nullable = false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long id; 

    [...] 

    @OneToMany(mappedBy = "transferDetails") 
    private List<ComponentEntity> components; 

    [...] 

} 

ComponentEntity:

@Entity 
@Table(name = ComponentEntity.TABLE_NAME, uniqueConstraints = @UniqueConstraint(name = ComponentEntity.TABLE_NAME 
     + AbstractEntity.SEPARATOR + AbstractEntity.CONSTRAINT, 
     columnNames = { ComponentEntity.COLUMN_NAME_SERIAL, ComponentEntity.COLUMN_NAME_TYPE })) 
@Getter 
@Setter 
@ToString(callSuper = true, exclude = { "parent" }) 
@NoArgsConstructor 
public class ComponentEntity extends AbstractEntity { 

    [...] 

    @Id 
    @Column(name = ID, nullable = false) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long id; 

    [...] 

    @ManyToOne(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = COLUMN_TRANSFER_DETAILS) 
    private TransferDetailsEntity transferDetails; 

    [...] 

} 

正如前面提到的,@PrivateOwner@OneToMany註釋(在TransfertDetailsEntity中)不起作用...

任何幫助表示讚賞

回答

1

沒有自動JPA或EclipseLink功能,將爲您執行此操作,您的應用程序將不得不處理此問題。

我能想到的最簡單的方法是刪除ComponentEntity,獲取引用的TransfertDetailsEntity並檢查其組件列表以查看它是否有其他ComponentEntity引用,如果沒有,則將其刪除。當你刪除它時,你應該從TransfertDetailsEntity.components列表中刪除每個ComponentEntity引用,所以這個列表應該是最新的並且不會產生任何數據庫命中。

+0

謝謝,這就是我所做的大致。那麼我會改進這個系統。 – minioim