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

Java JPA在删除时级联抽象/继承类,java,mysql,database,jpa,eclipselink,Java,Mysql,Database,Jpa,Eclipselink,我有一个抽象类TreeNode。我从他那里继承了Country和Location。然后我有一个类Role,其中包括预定义的角色,如管理员、用户等。这两个类在MappedRole类中映射在一起。mappedRole的数据库表包含treenode_id role_id和mappedRole_id列。 数据库中的表看起来很像我有一个国家和地区的表,因为我用table\u per\u Class创建了Treenode。因此,表MappedRole没有国家/地区和位置的ForeignKey。MappedR

我有一个抽象类
TreeNode
。我从他那里继承了
Country
Location
。然后我有一个类
Role
,其中包括预定义的角色,如管理员、用户等。这两个类在
MappedRole
类中映射在一起。mappedRole的数据库表包含treenode_id role_id和mappedRole_id列。 数据库中的表看起来很像我有一个国家和地区的表,因为我用
table\u per\u 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;
以及location类:

@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 {
@实体
@表(name=“standort”)
@NamedQuery(name=“standort.findAll”,query=“通过s.name desc从standort s订单中选择s”)
公共类标准扩展TreeNode实现可比较、可序列化{

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

级联只对声明它的实体有效。即

public class MappedRole {

  @ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.EAGER)
  @JoinColumn(name = "TREENODE_ID", nullable = false)
  private TreeNode treeNode;
如果删除了
MappedRole
,则应删除所有相应的
TreeNode
s

TreeNode
standor
中,您似乎没有反向的
@OneToMany
关系,因此当您删除
TreeNode
standom
时,JPA没有任何可以级联的关系

试着这样做:

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

  @OneToMany(cascade= { CascadeType.REMOVE }, mappedBy="treeNode" )
  private List<MappedRole> mappedRoles;
@MappedSuperclass
@继承(策略=继承类型。每个类的表)
公共抽象类TreeNode{
@OneToMany(cascade={CascadeType.REMOVE},mappedBy=“treeNode”)
私有列表映射角色;

并且确保将每个
MappedRole
也放入它所拥有的
TreeNode
列表中。谢谢。但是注释@MappedSuperclass重要吗?这与您的问题无关,但我认为如果JPA标准不要求,那么最好对每个持久类进行注释
@Entity
@可嵌入
@MappedSuperclass