Нарушение ограничения ссылочной целостности Hibernate H2 при обновлении и / или удалении - PullRequest
1 голос
/ 19 февраля 2020

Итак, я сейчас создаю базу данных для университетского проекта. В базе данных у нас будет объект, который ссылается на пользователя. Пользователи должны иметь возможность свободно добавлять, редактировать и удалять записи из базы данных.

Я могу создавать, редактировать и удалять пользователей, если им не назначена экспериментальная станция, на которой они будут работать. , Как только они назначены одному, я начинаю получать сообщение об ошибке:

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

Теперь я вроде понимаю, почему это происходит, поэтому атрибут ExperimentingStation имеет ссылку на пользователя и порок наоборот. Однако даже при установке 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;
    }
}

1 Ответ

0 голосов
/ 25 февраля 2020

После долгих раздумий мы решили не полностью удалять объекты из диспетчера сущностей, а вместо этого просто добавить VALID-булево значение для каждого элемента и извлекать только элементы Valid из базы данных, что работает безупречно.

...