搜索答案后,我看到了@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中)不起作用...
任何帮助表示赞赏
谢谢,这就是我所做的大致。那么我会改进这个系统。 – minioim