mappedBy 引用了一个未知的目标实体属性

Posted

技术标签:

【中文标题】mappedBy 引用了一个未知的目标实体属性【英文标题】:mappedBy reference an unknown target entity property 【发布时间】:2011-04-30 00:21:55 【问题描述】:

我在带注释的对象中设置一对多关系时遇到问题。

我有以下几点:

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

我在这里做错了什么

【问题讨论】:

【参考方案1】:

mappedBy 属性引用 customer 而属性为 mCustomer,因此出现错误消息。因此,要么将您的映射更改为:

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

或者将实体属性更改为customer(我会这样做)。

mappedBy 引用指示“在我收集的东西上查看名为 'customer' 的 bean 属性以查找配置。”

【讨论】:

那行得通,我原以为它会使用反射并使用 setter 或 getter 方法,而不是直接使用属性。 @boyd4715:您可以尝试在 getter 上移动您的注释,以查看使用属性访问(与字段访问相比)时会发生什么。另一方面,mappedBy 的 javadoc 说 拥有关系的字段 所以我不确定这会改变什么。 谢谢,对我帮助很大 当实际需求是 joincolumn lol 时,我使用了 mappedBy 从我在网上找到的任何示例中都不清楚这一点。感谢您详细说明。【参考方案2】:

我知道@Pascal Thivent 的答案已经解决了这个问题。我想在他对可能正在浏览此线程的其他人的回答中添加更多内容。

如果你像我一样在最初的几天学习并围绕使用带有'mappedBy'属性的@OneToMany注解的概念,这也意味着另一方持有@ManyToOne注解@JoinColumn 是这种双向关系的“所有者”。

此外,mappedBy 将 Class 变量的 实例名称(在此示例中为 mCustomer)作为输入,而不是 Class-Type(例如:客户)或实体名称(例如:客户)。

奖金: 另外,查看@OneToMany 注释的orphanRemoval 属性。如果设置为 true,那么如果在双向关系中删除父级,Hibernate 会自动删除它的子级。

【讨论】:

【参考方案3】:
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 " 应该等于通知列表 sender;而且 mappedBy="receiver" 应该等于通知列表 receiver;否则会报错。

【讨论】:

以上是关于mappedBy 引用了一个未知的目标实体属性的主要内容,如果未能解决你的问题,请参考以下文章

多对多 Spring MVC mappedBy 引用了一个未知的目标实体属性

java.lang.ExceptionInInitializerError 和 org.hibernate.AnnotationException: mappedBy 引用了一个未知的目标实体属性:

询问休眠:错误:mappedBy 引用未知的目标实体属性

JPA mappedBy 引用了一个未知的目标实体

OnetoOne 未知映射者

Hibernate中,mappedBy和注解@JoinColumn的对比