Mam problem z konfiguracją relacji jeden do wielu w moim obiekcie z adnotacjami.
Mam:
@MappedSuperclass
public abstract class MappedModel
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id",nullable=false,unique=true)
private Long mId;
wtedy to
@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;
i to
@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;
co ja tu robię źle
java
hibernate
orm
hibernate-annotations
boyd4715
źródło
źródło
mappedBy
mówi Pole, które jest właścicielem relacji, więc nie jestem pewien, czy to cokolwiek zmieni.Wiem, że odpowiedź @Pascal Thivent rozwiązała problem. Chciałbym dodać trochę więcej do jego odpowiedzi dla innych, którzy mogą surfować po tym wątku.
Jeśli jesteś podobny do mnie w początkowych dniach uczenia się i owijania głową wokół koncepcji używania
@OneToMany
adnotacji z właściwością „mappedBy
”, oznacza to również, że druga strona trzymająca@ManyToOne
adnotację z adnotacją@JoinColumn
jest „właścicielem” tego dwukierunkowego związek.Ponadto
mappedBy
przyjmuje nazwę instancji (mCustomer
w tym przykładzie) zmiennej Class jako dane wejściowe, a nie typ klasy (np. Klient) lub nazwę jednostki (np. Klient).BONUS: Przyjrzyj się także
orphanRemoval
właściwości@OneToMany
adnotacji. Jeśli ma wartość true, to jeśli rodzic zostanie usunięty w relacji dwukierunkowej, Hibernate automatycznie usuwa jego dzieci.źródło
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; }
Co zrozumiałem z odpowiedzi. mappedy = wartość „nadawca” powinna być taka sama w modelu powiadomienia. Podam ci przykład.
Model użytkownika:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "**sender**", cascade = CascadeType.ALL) List<Notification> sender; @OneToMany(fetch = FetchType.LAZY, mappedBy = "**receiver**", cascade = CascadeType.ALL) List<Notification> receiver;
Model powiadomienia:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL) List<Notification> **sender**; @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL) List<Notification> **receiver**;
Podałem pogrubioną czcionkę do modelu użytkownika i pola powiadomienia. Model użytkownika mappedBy = " sender " powinien być równy nadawcy listy powiadomień ; a mappedBy = „ receiver ” powinno być równe odbiorcy listy powiadomień ; Jeśli nie, pojawi się błąd.
źródło