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
。