JPA 在删除时级联 abstract/inherit Class

JPA Cascade a abstract/inherit Class on Delete

我有一个摘要classTreeNode。我从他那里继承了 classes CountryLocation。然后我有一个 class Role,其中包括管理员、用户等预定义角色。这两个 class 在 MappedRole class 中映射在一起。 mappedRole 的数据库 table 有列 treenode_id role_id 和 mappedRole_id。 数据库中的 table 看起来很像 我有一个 table 表示国家和位置,因为我用 Table_per_Class 创建了 Treenode。因此,table MappedRole 没有针对国家/地区的外键,并且 mappedRole 中的 location.The treenode_id 列包含其映射到的 class 的 ID。 JPA 与 table 上的大连接建立关系。

这是我的 MappedRole Class:

@Table(uniqueConstraints = { @UniqueConstraint(columnNames = { "TREENODE_ID", "ROLE_ID" }) }, name = "mappedrole")
@NamedQueries({ @NamedQuery(name = "mappedRole.checkIfUserExist", query = "SELECT count(mr.role) FROM MappedRole mr WHERE mr.role =?1") })
public class MappedRole implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.EAGER)
    @JoinColumn(name = "TREENODE_ID", nullable = false)
    private TreeNode treeNode;

    @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH }, fetch = FetchType.EAGER)
    @JoinColumn(name = "ROLE_ID")
    private Role role;

树节点class:

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class TreeNode extends Observable {
        @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected long id;

和位置 class:

@Entity
@Table(name = "standort")
@NamedQuery(name = "standort.findAll", query = "SELECT s FROM Standort s order by s.name desc")
public class Standort extends TreeNode implements Comparable<Standort>, Serializable {

如果我现在删除一个位置,即使我有 CascadeType.REMOVE,mappedRole 也不会被删除。我如何让 jpa 将位置的删除操作级联到 mappedRole table?

级联仅适用于声明它的实体。即

public class MappedRole {

  @ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.EAGER)
  @JoinColumn(name = "TREENODE_ID", nullable = false)
  private TreeNode treeNode;

应该删除所有对应的 TreeNodes if and when a MappedRole is deleted.

你似乎没有 TreeNodeStandort 中的反向 @OneToMany 关系,所以当你删除 TreeNodeStandort 时,有与 JPA 可以级联任何东西无关。

这样试试:

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class TreeNode ... {

  @OneToMany(cascade= { CascadeType.REMOVE }, mappedBy="treeNode" )
  private List<MappedRole> mappedRoles;

并确保将每个 MappedRole 也放入其拥有 TreeNodemappedRoles 列表中。