尝试映射未重复的集合类型对象(属性访问方法和JPA注释)时出错

尝试映射未重复的集合类型对象(属性访问方法和JPA注释)时出错,jpa,javafx,annotations,javafx-8,Jpa,Javafx,Annotations,Javafx 8,为了完成另一项任务,我需要重新定义我的POJO类,并使用属性访问来利用我提到的类中的JavaFX属性,但我面临这个错误 org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: deposito, for columns: [org.hibernate.mapping.Column(productoses)] 我已经尝试了中提到的解决方案,但仍然无法实现 是我的一个多实体类,也是

为了完成另一项任务,我需要重新定义我的POJO类,并使用属性访问来利用我提到的类中的JavaFX属性,但我面临这个错误

org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: deposito, for columns: [org.hibernate.mapping.Column(productoses)]
我已经尝试了中提到的解决方案,但仍然无法实现

是我的一个多实体类,也是我的多实体类

这是stacktrace

org.hibernate.MappingException: Could not determine type for: java.util.Set, at table: deposito, for columns: [org.hibernate.mapping.Column(productoses)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:455)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:422)
    at org.hibernate.mapping.Property.isValid(Property.java:226)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:597)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:265)
    at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:451)
    at org.hibernate.boot.internal.MetadataImpl.buildSessionFactory(MetadataImpl.java:170)
    at ajfmo.inventario.utils.HibernateUtil.getSessionFactory(HibernateUtil.java:19)
    at ajfmo.inventario.DAO.ProductDAO.<init>(ProductDAO.java:20)
    at ajfmo.inventario.view.MainView.<init>(MainView.java:60)
org.hibernate.MappingException:无法确定列:[org.hibernate.mapping.Column(productoses)]的java.util.Set的类型,在表:deposito中
位于org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:455)
位于org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:422)
位于org.hibernate.mapping.Property.isValid(Property.java:226)
位于org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:597)
位于org.hibernate.mapping.RootClass.validate(RootClass.java:265)
位于org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:329)
位于org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:451)
位于org.hibernate.boot.internal.MetadataImpl.buildSessionFactory(MetadataImpl.java:170)
在ajfmo.inventario.utils.HibernateUtil.getSessionFactory(HibernateUtil.java:19)上
在ajfmo.inventario.DAO.ProductDAO.(ProductDAO.java:20)
在ajfmo.inventario.view.MainView(MainView.java:60)上
编辑
这是我的冬眠课。一个是出现在堆栈跟踪中的DAO



提前谢谢你,这是我第一个使用hibernate的项目。。。或者确实是我的第一个项目。

在您的
存款
类中,我看到您的JPA注释在属性上,而不是像类中的其他任何地方一样在getter上(我怀疑这是您的问题,但保持一致可能是个好主意)

这里有:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "deposito")
private Set<Productos> productoses = new HashSet<Productos>(0);

public Set<Productos> getProductoses() {
  return this.productoses;
}
private ObjectProperty<Deposito> deposito;
private Deposito _deposito;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "deposito_producto", referencedColumnName = "descripcion_deposito", nullable = false)
public Deposito getDeposito() {
  if (deposito == null) {
    return _deposito;
  } else {
    return deposito.get();
  }
}
referencedColumnName=“Description\u deposito”
指向此方法(可能不是您想要的方法):

我不确定您的列名是什么,但是
referencedColumnName
应该指向
Productos
对象字段的主键/外键,请在
Productos
类中尝试以下操作:

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "deposito_producto", referencedColumnName = "idDeposito", nullable = false)
public Deposito getDeposito() {
  if (deposito == null) {
    return _deposito;
  } else {
    return deposito.get();
  }
}

因此,查看堆栈跟踪,问题似乎在
HibernateUtil
类中。它由
ProductDAO
类调用,该类由
MainView
类调用。你应该发布那些,而不是你发布的类。这会有很大帮助。另外,请参阅帮助他人解决您的问题。@MarkusK感谢您的评论。我编辑了帖子并添加了这两个类别,但我不认为问题来自于此,我认为是注释,但仍然没有找到解决方法。@nicolschl非常感谢!事实上,问题在于注释的错位。为了澄清您的疑问,以防万一,“producto”显然是产品,“deposito”是仓库,许多产品有一个仓库,一个仓库有许多产品,在我的产品表中有一个名为“deposito_productos”的varchar列,这是“Description_deposito”的FK,我发现这种方法在检索数据时更容易一些,不太确定,但到目前为止,对于我所需要的,它工作得很好,我知道在未来,我将不得不使用主键/外键建立这种关系。10倍!
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinColumn(name = "deposito_producto", referencedColumnName = "idDeposito", nullable = false)
public Deposito getDeposito() {
  if (deposito == null) {
    return _deposito;
  } else {
    return deposito.get();
  }
}