映射通过引用未知的目标实体属性

2022-08-31 10:01:10

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

我有以下几点:

@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

当属性为 时,该属性正在引用,因此出现错误消息。因此,请将映射更改为:mappedBycustomermCustomer

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

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

mappedBy 引用指示“在我拥有一个集合的事物上查找名为'customer'的 bean 属性以查找配置。


答案 2

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

如果你像我一样,在学习的最初几天里,把你的脑袋包裹在使用带有''属性的注释的概念上,这也意味着拿着注释的另一方是这种双向关系的“所有者”。@OneToManymappedBy@ManyToOne@JoinColumn

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

奖金:另外,研究注释的属性。如果设置为 true,则在双向关系中删除父项,则 Hibernate 会自动删除其子项。orphanRemoval@OneToMany


推荐