java - 更新和/或删除时违反 Hibernate H2 引用完整性约束

标签 java jpa persistence h2

所以我目前正在为一个大学项目建立一个数据库。 在数据库中,我们将有一个引用用户的对象。用户应该能够自由地添加、编辑和删除数据库中的条目。

我可以创建、编辑和删除用户,只要他们没有被分配到他们将工作的实验站即可。一旦它们被分配给一个,我就开始收到错误:

Referential integrity constraint violation: "FKGQN2NFAK1N6TWN592B0KQ34IT: PUBLIC.EXPERIMENTIERSTATION_USER FOREIGN KEY(BENUTZER_ID) REFERENCES PUBLIC.USER(ID) (.......)"; SQL statement:
delete from User where id=?

现在我确实有点理解为什么会发生这种情况,因此为什么 ExperimentingStation 属性引用了 User,反之亦然。 但是,即使将 CascadeType 设置为 MERGE,我仍然收到错误,我不太明白。我们使用 Hibernate 的默认配置,所以我知道我们不需要担心表名称,这就是为什么它们没有包含在下面的代码中,但是,我不知道如何在没有名称的情况下使用 mappedBy

另一个问题是,我们试图在 ExperimentingStation 中保留一个队列,但该队列也不起作用。

如有任何帮助,我们将不胜感激!

提前非常感谢

代码:

Class ExperimentierStation:

    import lombok.*;

    import javax.persistence.*;
    import java.util.List;
    import java.util.Queue;

    /** Experimenting stations data class */
    @Data
    @Entity
    @NamedQueries({
        @NamedQuery(name = "ExperimentierStation.findAllInLocation",
                query = "SELECT es FROM ExperimentierStation es WHERE es.standort = :standort"),
        @NamedQuery(name = "ExperimentierStation.getByStatus",
                query = "SELECT es FROM ExperimentierStation es WHERE es.status = :status"),
        @NamedQuery(name = "ExperimentierStation.getAll", query = "SELECT es FROM ExperimentierStation es")
    })
    @RequiredArgsConstructor
    @NoArgsConstructor
    public class ExperimentierStation {

    /** The station's id */
    @NonNull
    @Id
    private int esID;

    /** The station's location */
    @NonNull
    @ManyToOne
    private Standort standort;

    @NonNull
    private String name;

    /** The station's status */
    @NonNull
    private Enum<ExperimentierStationZustand> status;

    /** Conditions for using an experimenting station */
    @OneToMany
    private List<Bedingung> bedingungen;

    @NonNull
    @ManyToMany(cascade=CascadeType.MERGE, fetch = FetchType.LAZY)
    private List<User> benutzer;

    @OneToOne
    private ProzessSchritt currentPS;
    }

Class User:

    import lombok.*;

    import javax.persistence.*;
    import javax.ws.rs.Path;
    import java.time.LocalDateTime;
    import java.util.List;

    /**
     * This class is used to create user objects
     */
    @Data
    @Entity
    @NamedQueries({
        @NamedQuery(name = "User.findById", query = "SELECT u from User u WHERE u.id = :id"),
        @NamedQuery(name = "User.findByUsername", query = "SELECT u from User u WHERE u.username = :username"),
        @NamedQuery(name = "User.findByEmail", query = "SELECT u from User u WHERE u.email = :email"),
        @NamedQuery(name = "User.getAll", query = "SELECT u FROM User u")
    })
    @RequiredArgsConstructor(access = AccessLevel.PUBLIC)
    @NoArgsConstructor(access = AccessLevel.PUBLIC)
    public class User {

    /**
     * User's id
     */
    @Id
    @NonNull
    private int id;

    /**
     * The user's name
     */
    @NonNull
    private String vorname;

    /**
     * The user's surname
     */
    @NonNull
    private String nachname;

    /**
     * User's email address
     */
    @NonNull
    private String email;

    /**
     * The user's phone number
     */
    @NonNull
    private String telefonnummer;

    /**
     * User's username
     */
    @NonNull
    private String username;

    /**
     * User's hashed password
     */
    @NonNull
    private String password;

    /**
     * Is the user verified?
     */
    @NonNull
    private boolean wurdeVerifiziert;

    /**
     * Creation date of the user object
     */
    @NonNull
    private LocalDateTime erstellungsDatum;

    /**
     * The role's of the user
     */
    @NonNull
    @ElementCollection
    private List<Role> rollen;


    /**
     * The User's language preference
     */
    @NonNull
    private String language;

    public String toString() {
        return vorname + nachname;
    }
}

最佳答案

经过深思熟虑,我们决定不完全从实体管理器中删除对象,而只是向每个元素添加一个 VALID boolean 值,并仅从数据库中获取 Valid 元素,这样可以完美地工作。

关于java - 更新和/或删除时违反 Hibernate H2 引用完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303929/

相关文章:

java - 为什么不在 LinkedList 中定义 ListIterator 的静态类?

java - 嵌套 n :m + attributes JPA

mysql - 将 @jointable 与所有非唯一列一起使用

serialization - 是什么让 Smalltalk 能够进行图像持久化,为什么像 Ruby/Python 这样的语言不能序列化自己?

java - 初始 SessionFactory 创建失败 : java. lang.NoClassDefFoundError: javax/persistence/NamedStoredProcedureQuery

java - 来自 cmdline 的 Junit - java.lang.ClassNotFoundException

java - 使 Swing JMenuBar 出现的问题

java - 如何使用端点将事物列表分配给另一个事物列表

java - QueryDSL:QueryDSL 2.9.0 中 ConstructorExpression 和 CaseBuilder 的 JPA 示例

php - PHP 中的文件资源持久性