JPA 在删除时级联 abstract/inherit Class
JPA Cascade a abstract/inherit Class on Delete
我有一个摘要classTreeNode
。我从他那里继承了 classes Country
和 Location
。然后我有一个 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;
应该删除所有对应的 TreeNode
s if and when a MappedRole
is deleted.
你似乎没有 TreeNode
或 Standort
中的反向 @OneToMany
关系,所以当你删除 TreeNode
或 Standort
时,有与 JPA 可以级联任何东西无关。
这样试试:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class TreeNode ... {
@OneToMany(cascade= { CascadeType.REMOVE }, mappedBy="treeNode" )
private List<MappedRole> mappedRoles;
并确保将每个 MappedRole
也放入其拥有 TreeNode
的 mappedRoles
列表中。
我有一个摘要classTreeNode
。我从他那里继承了 classes Country
和 Location
。然后我有一个 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;
应该删除所有对应的 TreeNode
s if and when a MappedRole
is deleted.
你似乎没有 TreeNode
或 Standort
中的反向 @OneToMany
关系,所以当你删除 TreeNode
或 Standort
时,有与 JPA 可以级联任何东西无关。
这样试试:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class TreeNode ... {
@OneToMany(cascade= { CascadeType.REMOVE }, mappedBy="treeNode" )
private List<MappedRole> mappedRoles;
并确保将每个 MappedRole
也放入其拥有 TreeNode
的 mappedRoles
列表中。