У меня возникла проблема с установкой отношения "один ко многим" в моем аннотированном объекте.
Имею следующее:
@MappedSuperclass
public abstract class MappedModel
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id",nullable=false,unique=true)
private Long mId;
тогда это
@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;
и это
@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;
что я здесь делаю неправильно
java
hibernate
orm
hibernate-annotations
мальчик4715
источник
источник
mappedBy
указано поле, которое владеет отношениями, поэтому я не уверен, что это что-то изменит.Я знаю, что ответ @Pascal Thivent решил проблему. Я хотел бы добавить немного больше к его ответу для тех, кто просматривает эту ветку.
Если вы похожи на меня в первые дни обучения и погружения в концепцию использования
@OneToMany
аннотации соmappedBy
свойством ' ', это также означает, что другая сторона, держащая@ManyToOne
аннотацию с@JoinColumn
является `` владельцем '' этой двунаправленной отношения.Кроме того,
mappedBy
в качестве входных данных принимает имя экземпляра (mCustomer
в этом примере) переменной Class, а не Class-Type (например: Customer) или имя объекта (Ex: customer).БОНУС: Также обратите внимание на
orphanRemoval
свойство@OneToMany
аннотации. Если для него установлено значение true, то если родитель удаляется в двунаправленной связи, Hibernate автоматически удаляет его дочерние элементы.источник
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; }
Что я понял из ответа. Значение mappedy = "sender" должно быть таким же в модели уведомления. Приведу пример ..
Модель пользователя:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "**sender**", cascade = CascadeType.ALL) List<Notification> sender; @OneToMany(fetch = FetchType.LAZY, mappedBy = "**receiver**", cascade = CascadeType.ALL) List<Notification> receiver;
Модель уведомления:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL) List<Notification> **sender**; @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL) List<Notification> **receiver**;
Я выделил полужирным шрифтом модель пользователя и поле уведомлений. Модель пользователя mappedBy = " sender " должна быть равна отправителю списка уведомлений ; а mappedBy = " receiver " должно быть равно получателю списка уведомлений ; В противном случае вы получите ошибку.
источник