休眠映射多对一两次



我的模型中有以下内容:成品车

 private ObjectProperty<InMonter> inMonter = new SimpleObjectProperty<>();
  @ManyToOne
@JoinColumn(name = "in_Monter_Id",referencedColumnName="inMonterId" )
public InMonter getInMonter() {
    return inMonter.get();
}
public ObjectProperty<InMonter> inMonterProperty() {
    return inMonter;
}
public void setInMonter(InMonter inMonter) {
    this.inMonter.set(inMonter);
}

蒙特:

private List<FinishedCar> fCar;
 @OneToMany(mappedBy ="inMonter")
public List<FinishedCar> getfCar() {
    return fCar;
}
public void setfCar(List<FinishedCar> fCar) {
    this.fCar = fCar;
}

我想完成的是像这样再次进行此映射:

private ObjectProperty<InMonter> outMonter = new SimpleObjectProperty<>();
 @ManyToOne
@JoinColumn(name = "out_monter_id",referencedColumnName="inMonterId")
 public InMonter getMonterOut() {
    return outMonter.get();
}
public ObjectProperty<InMonter> monterOutProperty() {
    return outMonter;
}
public void setMonterOut(InMonter outMonter) {
    this.outMonter.set(outMonter);
}

而这个

private List<FinishedCar> OutCar;
@OneToMany(mappedBy ="outMonter")
public List<FinishedCar> getOutCar() {
    return OutCar;
}
public void setOutCar(List<FinishedCar> OutCar) {
    this.OutCar = OutCar;
}

当我尝试两次这种连接时,我得到

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.atlas.model.FinishedCar.outMonter in com.atlas.model.InMonter.outCar

但是如果我只使用一个 ManyToOne 注释,它工作正常,我没有混合我的注释,我在我的类中使用了 AccesType.property。

根据此链接,多个@ManyToOne字段指向JPA/Hibernate中的同一实体,我试图完成的是可能的,那为什么我有错误?

最后:我需要的是在我的成品车里有两个蒙特菲尔德,但它们都来自同一个实体,名叫蒙特。我可以通过使用不同的表来实现这一点,但这样做毫无意义。

在这种情况下,

Hibernate使用getter名称作为属性名称(而不是字段名称(。

@Entity
class FinishedCar {
  @ManyToOne
  @JoinColumn(name = "in_monter_id")
  public Monter getInMonter() {
  }
  @ManyToOne
  @JoinColumn(name = "out_monter_id")
  public Monter getOutMonter() {
  }
}
@Entity
class Monter {
  @OneToMany(mappedBy ="inMonter")
  public List<FinishedCar> getfCar() {
  }
  @OneToMany(mappedBy ="outMonter")
  public List<FinishedCar> getOutCar() {
  }
}

请学习 Java 命名约定并始终 (!( 使用它。你将来会遇到更少的问题。例如,不应使用如下字段名称:OutCar .

此外,尝试了解属性名称如何与 getter 和 setter 名称相对应。例如,你应该有getter和setter来拥有一个属性。

好吧,我必须感谢v.ladynew和XtremeBaumer的帮助。

首先,我遇到了问题,我没有为我的第二个字段使用正确的命名,其次我没有为我的 id 列使用@Column注释,所以休眠会感到困惑,当我纠正这些并开始使用 Monter 类而不是 InMonter 类时,我设法让它工作:

   @OneToMany(mappedBy ="outMonter")
public List<FinishedCar> getFinishedCars() {
    return finishedCars;
}
public void setFinishedCars(List<FinishedCar> finishedCars) {
    this.finishedCars = finishedCars;
}
@OneToMany(mappedBy ="inMonter")
public List<FinishedCar> getFinishedCarsTest() {
    return finishedCarsTest;
}
public void setFinishedCarsTest(List<FinishedCar> finishedCarsTest) {
    this.finishedCarsTest = finishedCarsTest;
}

  @ManyToOne
@JoinColumn(name="outMonterId",referencedColumnName = "monterId")
public Monter getOutMonter() {
    return outMonter.get();
}
   @ManyToOne
@JoinColumn(name="inMonterId",referencedColumnName = "monterId")
public Monter getInMonter() {
    return inMonter.get();
}

即使这个映射本身是正确的,直到我在我的 id 字段上添加@Column它才起作用:

 @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="monterId")
public int getId() {
    return monterId.get();
}

最新更新