gpt4 book ai didi

java - JPA 删除时级联抽象/继承类

转载 作者:行者123 更新时间:2023-11-29 09:43:27 24 4
gpt4 key购买 nike

我有一个抽象类TreeNode 。我从他那里继承了类(class) CountryLocation 。然后我有课Role其中包括预定义的角色,如管理员、用户等。这两个类在 MappedRole 中映射在一起。类(class)。 mappedRole 的数据库表具有treenode_id、role_id 和mappedRole_id 列。数据库中的表看起来很相似我有一个国家和位置表,因为我使用 Table_per_Class 创建 Treenode 。因此,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;

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,mappedRole也不会被删除。 。如何让jpa将某个位置的删除操作级联到mappedRole表?

最佳答案

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

public class MappedRole {

@ManyToOne(cascade = { CascadeType.REMOVE }, fetch = FetchType.EAGER)
@JoinColumn(name = "TREENODE_ID", nullable = false)
private TreeNode treeNode;

如果删除 MappedRole,则应删除所有相应的 TreeNode

您在TreeNodeStandort中似乎没有反@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 也放入其所属 TreeNodemappedRoles 列表中。

关于java - JPA 删除时级联抽象/继承类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56145268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com