【问题标题】:Hibernate mapping ManyToOne two timesHibernate 映射 ManyToOne 两次
【发布时间】:2017-05-27 05:39:18
【问题描述】:

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

 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。

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

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

【问题讨论】:

  • 你的表中的所有列都有吗?
  • 什么意思?所有的表和列都是由hibernate创建的,所以如果映射没问题我认为应该没有问题
  • 您希望数据库中的 inMonter 和 outMonter 有不同的列?
  • 是的,我希望在我的成品汽车实体中有列 inMonter 和 outMonter。当我用一列执行此操作时,它可以工作,但有两个我有问题
  • 你应该在 FinishedCar 类中有一个 outMonter 属性。你只有 InMonter。

标签: java spring hibernate jpa


【解决方案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 才能拥有一个属性。

【讨论】:

  • 好吧,你唯一正确的是我使用了糟糕的命名(但这是我刚刚快速进行测试的字段)。除此之外,我在 getter 上使用了注释,正如您在我的原始帖子中看到的那样,我还为我的实体使用了 @Access(AccessType.PROPERTY) 来明确显示休眠在哪里查找映射。你能以任何其他方式帮助我吗?我同意我必须正确整理我的命名,然后我会更新我的原始帖子。
【解决方案2】:

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

首先,我遇到的问题是我没有为我的第二个字段使用正确的命名,其次我没有为我的 id 列使用@Column 注释,所以当我更正这些并开始使用 Monter 类时,hibernate 会感到困惑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();
}

【讨论】:

  • 它不起作用,因为没有@Column 你有id 列,但引用了referencedColumnName = "monterId"
猜你喜欢
  • 1970-01-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
相关资源
最近更新 更多