Итак, я сейчас создаю базу данных для университетского проекта. В базе данных у нас будет объект, который ссылается на пользователя. Пользователи должны иметь возможность свободно добавлять, редактировать и удалять записи из базы данных.
Я могу создавать, редактировать и удалять пользователей, если им не назначена экспериментальная станция, на которой они будут работать. , Как только они назначены одному, я начинаю получать сообщение об ошибке:
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;
}
}