Ich habe ein Problem beim Einrichten einer Eins-zu-Viele-Beziehung in meinem mit Anmerkungen versehenen Objekt.
Ich habe folgendes:
@MappedSuperclass
public abstract class MappedModel
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id",nullable=false,unique=true)
private Long mId;
dann das
@Entity
@Table(name="customer")
public class Customer extends MappedModel implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -2543425088717298236L;
/** The collection of stores. */
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<Store> stores;
und das
@Entity
@Table(name="store")
public class Store extends MappedModel implements Serializable
{
/**
*
*/
private static final long serialVersionUID = -9017650847571487336L;
/** many stores have a single customer **/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn (name="customer_id",referencedColumnName="id",nullable=false,unique=true)
private Customer mCustomer;
Was mache ich hier falsch?
java
hibernate
orm
hibernate-annotations
boyd4715
quelle
quelle
mappedBy
sagt der Javadoc von Das Feld, dem die Beziehung gehört, also bin ich mir nicht sicher, ob dies irgendetwas ändern wird.Ich weiß, dass die Antwort von @Pascal Thivent das Problem gelöst hat. Ich möchte seiner Antwort für andere, die möglicherweise in diesem Thread surfen, etwas mehr hinzufügen.
Wenn Sie wie ich in den ersten Tagen des Lernens sind und sich mit dem Konzept der Verwendung der
@OneToMany
Annotation mit dermappedBy
Eigenschaft ' ' beschäftigen, bedeutet dies auch, dass die andere Seite, die die@ManyToOne
Annotation mit der Eigenschaft 'hält,@JoinColumn
der' Eigentümer 'dieser bidirektionalen Richtung ist Beziehung.Nimmt auch
mappedBy
den Instanznamen (mCustomer
in diesem Beispiel) der Klassenvariablen als Eingabe und nicht den Klassentyp (Beispiel: Kunde) oder den Entitätsnamen (Beispiel: Kunde).BONUS: Sehen Sie sich auch die
orphanRemoval
Eigenschaft der@OneToMany
Annotation an. Wenn es auf true gesetzt ist und ein Elternteil in einer bidirektionalen Beziehung gelöscht wird, löscht der Ruhezustand automatisch seine untergeordneten Elemente.quelle
public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "USER_ID") Long userId; @OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL) List<Notification> sender; @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL) List<Notification> receiver; } public class Notification implements Serializable { private static final long serialVersionUID = 1L; @Id @Column(name = "NOTIFICATION_ID") Long notificationId; @Column(name = "TEXT") String text; @Column(name = "ALERT_STATUS") @Enumerated(EnumType.STRING) AlertStatus alertStatus = AlertStatus.NEW; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "SENDER_ID") @JsonIgnore User sender; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "RECEIVER_ID") @JsonIgnore User receiver; }
Was ich aus der Antwort verstanden habe. mappedy = "Absender" -Wert sollte im Benachrichtigungsmodell identisch sein. Ich werde Ihnen ein Beispiel geben ..
Benutzermodell:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "**sender**", cascade = CascadeType.ALL) List<Notification> sender; @OneToMany(fetch = FetchType.LAZY, mappedBy = "**receiver**", cascade = CascadeType.ALL) List<Notification> receiver;
Benachrichtigungsmodell:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL) List<Notification> **sender**; @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL) List<Notification> **receiver**;
Ich habe dem Benutzermodell und dem Benachrichtigungsfeld eine fette Schrift gegeben. Benutzermodell mappedBy = " Absender " sollte gleich Absender der Benachrichtigungsliste sein ; und mappedBy = „ Empfänger “ sollte Meldeliste gleich Empfänger ; Wenn nicht, erhalten Sie eine Fehlermeldung.
quelle