Hibernate映射ManyToOne两次

时间:2017-05-26 09:42:39

标签: java spring hibernate jpa

我的模型中有以下内容: 完车?

 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);
}

的Monter:

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。

根据这个链接Multiple @ManyToOne fields pointing to same entity in JPA / Hibernate我想要完成的是什么,那为什么我会有错误呢?

最后: 我需要的是在我的成品车中有两个monter字段,但它们都来自同一个实体,名为Monter。我可以通过使用不同的表格来实现这一目标,但这样做毫无意义。

2 个答案:

答案 0 :(得分:1)

在这种情况下,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拥有一个属性。

答案 1 :(得分:0)

我必须感谢v.ladynew和XtremeBaumer,寻求帮助。

首先,我有一个问题,我没有使用正确的命名为我的第二个字段,第二个我没有使用@Column注释我的id列,所以hibernate会混淆,当我纠正这些并开始使用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();
}