JPA在删除时级联抽象/继承类

时间:2019-05-15 08:55:15

标签: java mysql database jpa eclipselink

我有一个抽象类TreeNode。我从他那里继承了CountryLocation类。然后,我有一个类Role,其中包含预定义角色,例如管理员,用户等。这两个类在MappedRole类中映射在一起。 mappingRole的数据库表具有列treenode_id,role_id和mappingRole_id。 数据库中的表看起来很像,因为我用Table_per_Class创建Treenode,所以我有一个用于国家和位置的表。因此,表MappedRole没有用于国家和地区的ForeignKey.mappedRole中的treenode_id列包含其映射到的类的ID。 JPA在两个表上都建立了强大的联接。

这是我的MappedRole类别:

@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;

TreeNode类:

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

和位置类别:

@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级联将位置的删除操作级联到mappingRole表?

1 个答案:

答案 0 :(得分:1)

级联仅适用于在其中声明的实体。

public class MappedRole {

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

应该删除所有对应的TreeNode如果以及何时删除MappedRole

您似乎在@OneToManyTreeNode中没有相反的Standort关系,因此删除TreeNodeStandort时就没有关系JPA可以级联任何东西。

像这样尝试:

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

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

并确保将每个MappedRole也放入其拥有的mappedRoles的{​​{1}}列表中。