我的模型中有以下内容:成品车
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();
}