[英]JPA Cascade a abstract/inherit Class on Delete
我有一个抽象类TreeNode
。 我从他那里继承了Country
和Location
类。 然后,我有一个Role
类,其中包括预定义角色,例如管理员,用户等。这两个类在MappedRole
类中映射在一起。 mappingRole的数据库表具有列treenode_id,role_id和mappingRole_id。 数据库中的表看起来很像,因为我使用Table_per_Class
创建Treenode, Table_per_Class
我有一个用于国家和位置的表。 因此,表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
,也不会将被映射的角色删除。 我如何才能让JPA级联将位置的删除操作映射到mappingRole表?
级联仅适用于在其中声明的实体。即,
public class MappedRole {
@ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.EAGER)
@JoinColumn(name = "TREENODE_ID", nullable = false)
private TreeNode treeNode;
如果以及何时删除MappedRole
删除所有对应的TreeNode
。
您似乎在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
列表中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.