2017-05-26 119 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”'。 –