为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2022-11-30 11:19:51
我有一个抽象类TreeNode。我从他那里继承了课程Country和Location。然后我有一个Role包含预定义角色(如管理员、用户等)的类。这两个类在MappedRole该类中映射在一起。mappedRole 的数据库表有列 treenode_id role_id 和 mappedRole_id。数据库中的表看起来很像我有一个国家和位置表,因为我使用Table_per_Class. 因此,表 MappedRole 没有用于国家和位置的外键。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;树节点类:@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 {如果我现在删除一个位置,即使我有 .mappedRole 也不会被删除CascadeType.REMOVE。如何让 jpa 将位置的删除操作级联到 mappedRole 表?
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

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


public class MappedRole {


  @ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.EAGER)

  @JoinColumn(name = "TREENODE_ID", nullable = false)

  private TreeNode treeNode;

当删除a时,应删除所有对应TreeNode的 s 。MappedRole


您似乎在or中没有反向@OneToMany关系,因此当您删除 a or时,JPA 可以级联任何内容都没有关系。TreeNodeStandortTreeNodeStandort


像这样尝试:


@MappedSuperclass

@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

public abstract class TreeNode ... {


  @OneToMany(cascade= { CascadeType.REMOVE }, mappedBy="treeNode" )

  private List<MappedRole> mappedRoles;

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


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信