Tengo un problema al establecer una relación de uno a muchos en mi objeto anotado.
Tengo lo siguiente:
@MappedSuperclass
public abstract class MappedModel
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id",nullable=false,unique=true)
private Long mId;
luego esto
@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;
y esto
@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;
que estoy haciendo incorrecto aqui
java
hibernate
orm
hibernate-annotations
boyd4715
fuente
fuente
mappedBy
dice El campo que posee la relación, así que no estoy seguro de que esto cambie nada.Sé que la respuesta de @Pascal Thivent ha resuelto el problema. Me gustaría agregar un poco más a su respuesta a otros que podrían estar navegando por este hilo.
Si eres como yo en los primeros días de aprendizaje y entiendes el concepto de usar la
@OneToMany
anotación con lamappedBy
propiedad " ", también significa que el otro lado que sostiene la@ManyToOne
anotación con la@JoinColumn
es el "propietario" de este bidireccional relación.Además,
mappedBy
toma el nombre de la instancia (mCustomer
en este ejemplo) de la variable de clase como entrada y no el tipo de clase (por ejemplo, cliente) o el nombre de la entidad (por ejemplo, cliente).BONUS: Además, busque en la
orphanRemoval
propiedad de@OneToMany
anotación. Si se establece en verdadero, entonces si un padre se elimina en una relación bidireccional, Hibernate borra automáticamente sus hijos.fuente
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; }
Lo que entendí de la respuesta. El valor de mappedy = "sender" debe ser el mismo en el modelo de notificación. Te daré un ejemplo..
Modelo de usuario:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "**sender**", cascade = CascadeType.ALL) List<Notification> sender; @OneToMany(fetch = FetchType.LAZY, mappedBy = "**receiver**", cascade = CascadeType.ALL) List<Notification> receiver;
Modelo de notificación:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL) List<Notification> **sender**; @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL) List<Notification> **receiver**;
Le di fuente en negrita al modelo de usuario y al campo de notificación. El modelo de usuario mappedBy = " sender " debe ser igual al remitente de la lista de notificaciones ; y mappedBy = " receptor " debe ser igual al receptor de la lista de notificaciones ; Si no, obtendrá un error.
fuente