알려지지 않은 대상 엔티티 속성을 참조하여 매핑


85

주석이 달린 개체에서 일대 다 관계를 설정하는 데 문제가 있습니다.

다음이 있습니다.

@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;

내가 여기서 뭘 잘못하고 있니

답변:


148

mappedBy속성을 참조하는 customer속성 인 반면 mCustomer, 따라서 에러 메시지. 따라서 매핑을 다음 중 하나로 변경하십시오.

/** The collection of stores. */
@OneToMany(mappedBy = "mCustomer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Collection<Store> stores;

또는 엔티티 속성을 customer(내가 할 일) 으로 변경하십시오 .

mappingBy 참조는 "구성을 찾기 위해 컬렉션이있는 항목에서 'customer'라는 이름의 bean 속성을 살펴 봅니다."를 나타냅니다.


효과가 있었기 때문에 리플렉션을 사용하여 속성이 아닌 setter 또는 getter 메서드를 직접 사용할 것으로 예상했습니다.
boyd4715

@ boyd4715 : getter에서 주석을 이동하여 속성 액세스 (필드 액세스 대)를 사용할 때 어떤 일이 발생하는지 확인할 수 있습니다. 반면에 javadoc은 관계를 소유하는 필드를mappedBy 말합니다 . 그래서 이것이 아무것도 바꿀지 확신하지 못합니다.
Pascal Thivent

감사의 나에게 많은 도움이 것을
오사마 알 - BANNA

9

@Pascal Thivent 의 답을 알고 있습니다. 문제가 해결 있습니다. 나는이 스레드를 서핑 할 수있는 다른 사람들에 대한 그의 답변에 조금 더 추가하고 싶습니다.

당신은 학습과 사용의 개념의 주위에 당신의 머리를 포장의 초기 시대에 나 같은 경우 @OneToMany'로 주석을 mappedBy'다른면이 유지 것을, 그것은 또한 수단 재산 @ManyToOne(가)와 주석을 @JoinColumn이 양방향의 소유자 '는이를' 관계.

또한 Class-Type (ex : Customer) 또는 엔티티 이름 (Ex : customer)이 아닌 Class 변수 mappedBy인스턴스 이름 ( mCustomer이 예에서는)을 입력으로 받습니다.

BONUS : 또한 Annotation 의 orphanRemoval속성을 살펴보십시오 @OneToMany. true로 설정되면 부모가 양방향 관계에서 삭제되면 Hibernate는 자동으로 자식을 삭제합니다.


0
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 = " 수신자 "는 알림 목록 수신자 와 같아야합니다 . 그렇지 않으면 오류가 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.