2016-07-28 40 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