주석이 달린 개체에서 일대 다 관계를 설정하는 데 문제가 있습니다.
다음이 있습니다.
@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;
내가 여기서 뭘 잘못하고 있니
답변
mappedBy
속성을 참조하는 customer
속성 인 반면 mCustomer
, 따라서 에러 메시지. 따라서 매핑을 다음 중 하나로 변경하십시오.
/** The collection of stores. */
@OneToMany(mappedBy = "mCustomer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<Store> stores;
또는 엔티티 속성을 customer
(내가 할 일) 으로 변경하십시오 .
mappingBy 참조는 “구성을 찾기 위해 컬렉션이있는 항목에서 ‘customer’라는 이름의 bean 속성을 살펴 봅니다.”를 나타냅니다.
답변
@Pascal Thivent 의 답을 알고 있습니다. 문제가 해결 있습니다. 나는이 스레드를 서핑 할 수있는 다른 사람들에 대한 그의 답변에 조금 더 추가하고 싶습니다.
당신은 학습과 사용의 개념의 주위에 당신의 머리를 포장의 초기 시대에 나 같은 경우 @OneToMany
‘로 주석을 mappedBy
‘다른면이 유지 것을, 그것은 또한 수단 재산 @ManyToOne
(가)와 주석을 @JoinColumn
이 양방향의 소유자 ‘는이를’ 관계.
또한 Class-Type (ex : Customer) 또는 엔티티 이름 (Ex : customer)이 아닌 Class 변수 mappedBy
의 인스턴스 이름 ( mCustomer
이 예에서는)을 입력으로 받습니다.
BONUS : 또한 Annotation 의 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;
}
대답에서 이해 한 것. mappingy = “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**;
사용자 모델과 알림 필드에 굵은 글꼴을 적용했습니다. 사용자 모델 mappingBy = ” 발신자 “는 알림 목록 발신자 와 동일해야합니다 . 그리고 mappingBy = ” 수신자 “는 알림 목록 수신자 와 같아야합니다 . 그렇지 않으면 오류가 발생합니다.