搜索答案後,我看到了@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