Estou tendo um problema em estabelecer uma relação um para muitos em meu objeto anotado.
Eu tenho o seguinte:
@MappedSuperclass
public abstract class MappedModel
{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id",nullable=false,unique=true)
private Long mId;
então isso
@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;
e isto
@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;
o que estou fazendo de incorreto aqui
java
hibernate
orm
hibernate-annotations
boyd4715
fonte
fonte
mappedBy
diz O campo que possui o relacionamento, então não tenho certeza de que isso mudará alguma coisa.Eu sei que a resposta de @Pascal Thivent resolveu o problema. Eu gostaria de acrescentar um pouco mais à sua resposta para outras pessoas que podem estar navegando neste tópico.
Se você for como eu nos primeiros dias de aprendizagem e envolvendo-se no conceito de usar a
@OneToMany
anotação com amappedBy
propriedade ' ', isso também significa que o outro lado segurando a@ManyToOne
anotação com@JoinColumn
é o 'dono' deste bidirecional relação.Além disso,
mappedBy
leva o nome da instância (mCustomer
neste exemplo) da variável Class como uma entrada e não o Class-Type (ex: Customer) ou o nome da entidade (Ex: customer).BÔNUS: Além disso, observe a
orphanRemoval
propriedade da@OneToMany
anotação. Se for definido como verdadeiro, então se um pai for deletado em um relacionamento bidirecional, o Hibernate deleta automaticamente seus filhos.fonte
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; }
O que entendi com a resposta. O valor mappedy = "sender" deve ser o mesmo no modelo de notificação. Vou lhe dar um exemplo..
Modelo de usuário:
@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 notificação:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "sender", cascade = CascadeType.ALL) List<Notification> **sender**; @OneToMany(fetch = FetchType.LAZY, mappedBy = "receiver", cascade = CascadeType.ALL) List<Notification> **receiver**;
Eu dei fonte em negrito para o modelo do usuário e campo de notificação Modelo de usuário mappedBy = " remetente " deve ser igual ao remetente da Lista de notificação ; e mappedBy = " receptor " deve ser igual ao receptor da lista de notificações ; Caso contrário, você obterá um erro.
fonte