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

110

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

我的情况如下:

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

我在这里做错了什么?

3个回答

201

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
@boyd4715: 你可以尝试将注释移到getter上,以了解在使用属性访问(vs字段访问)时会发生什么。另一方面,“mappedBy”的javadoc说:“拥有关系的字段”,所以我不确定这样做会改变什么。 - Pascal Thivent
谢谢,这对我很有帮助。 - Osama Al-Banna
我在使用mappedBy时,实际需求应该是joincolumn哈哈 - 10101010
这是我在网上找到的任何示例中都不太清楚的内容。感谢您明确解释。 - Steve

20

我知道@Pascal Thivent提供了解决方法。我想对他的答案进行补充,以帮助那些正在搜索此主题的其他人。

如果您和我一样,刚开始学习并理解使用含有'mappedBy'属性的@OneToMany注释的概念时,这也意味着另一侧持有@ManyToOne注释与@JoinColumn是此双向关系的“所有者”。

此外,mappedBy接受类变量的实例名称(在此示例中为mCustomer)作为输入,而不是类类型(例如:Customer)或实体名(例如:customer)。

BONUS: 还要看一下@OneToMany注释的orphanRemoval属性。如果设置为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;
}

从答案中我理解的是,通知模型中的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**;

我给用户模型和通知字段加粗字体。User model mappedBy="sender "应该等于通知列表中的 sender; 且mappedBy="receiver"应该等于通知列表中的 receiver; 如果不是,将会出现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接