2017-05-26 124 views
0

我在我的模型如下: 成品車Hibernate映射多對一兩次

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 

但如果我只使用一個多對一註釋它工作得很好,我不合羣,我的註解,我用AccesType.property上我的課。

並根據此鏈接Multiple @ManyToOne fields pointing to same entity in JPA/Hibernate我想完成什麼是可能的,那麼爲什麼我有一個錯誤?

最後: 我需要的是在我的成品車中有兩個獨特的領域,但他們都來自同一個實體,名爲蒙特。我可以通過使用不同的表格來實現這一點,但它無法做到這一點。

+0

你有你的表中的所有列? – XtremeBaumer

+0

你是什麼意思?所有的表和列都是通過休眠創建的,所以如果映射是好的,我認爲應該沒有問題 – ImRaphael

+0

你想在inMonter和outMonter數據庫中使用不同的列? – XtremeBaumer

回答

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來擁有一個屬性。

+0

嗯,你唯一正確的做法是我使用了不好的命名方式(但它是我真正快速測試的字段)。 除此之外,我在getters上使用了註釋,就像你在我原來的帖子中看到的那樣,我還使用@Access(AccessType.PROPERTY)爲我的實體顯式地顯示了hibernate在哪裏查找映射。你能以其他任何方式幫助我嗎?我同意我必須正確清理我的命名,然後我將更新我的原始帖子。 – ImRaphael

0

嗯,我必須感謝v.ladynew和XtremeBaumer,尋求幫助。

首先,我有問題,我沒有使用適當的命名我的第二個領域,第二我沒有使用@Column註解我的ID列,所以冬眠會弄糊塗,當我糾正這些,並開始使用蒙特級而不是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字段:

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

它沒有工作,因爲沒有@Column你有'ID'列,但提到'referencedColumnName =「monterId」'。 –