Java Hibarnate org.hibernate.MappingException:无法确定类型SimpleStringProperty

Java Hibarnate org.hibernate.MappingException:无法确定类型SimpleStringProperty,java,database,hibernate,javafx,Java,Database,Hibernate,Javafx,这个问题已经被问了很多次,但似乎没有一个答案对我有任何帮助,所以我将尝试再次问它,并希望好运: 我有班级的分数 @Entity(name="SokoTable") public class Score implements Serializable{ @Column(name="ID") @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private private SimpleInte

这个问题已经被问了很多次,但似乎没有一个答案对我有任何帮助,所以我将尝试再次问它,并希望好运:

我有班级的分数

    @Entity(name="SokoTable")
    public class Score implements Serializable{

    @Column(name="ID")
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private private SimpleIntegerProperty id;

    @Column(name="Username")
    private SimpleStringProperty userName;
    @Column(name="Level")
    private SimpleStringProperty levelName;
    @Column(name="Steps")
    private SimpleIntegerProperty steps;
    @Column(name="Time")
    private SimpleIntegerProperty time;
    public Score(){ 
    }
    public Score(String userName, String levelName, int steps, int time) {
        super();
        this.userName = new SimpleStringProperty(userName);
        this.levelName = new SimpleStringProperty(levelName);
        this.steps = new SimpleIntegerProperty(steps);
        this.time = new SimpleIntegerProperty(time);
    }
    public int getId() {
        return id.get();
    }

    public void setId(int id) {
        this.id.set(id);
    }

    public String getUserName() {
        return userName.get();
    }
    public void setUserName(String userName) {
        this.userName.set(userName);
    }
    public String getLevelName() {
        return levelName.get();
    }
    public void setLevelName(String levelName) {
        this.levelName.set(levelName);
    }
    public int getSteps() {
        return steps.get();
    }
    public void setSteps(int steps) {
        this.steps.set(steps);
    }
    public int getTime() {
        return time.get();
    }
    public void setTime(int time) {
        this.time.set(time);
    }   
    }
将管理数据库的类SokoDBManager

public class SokoDBManager {

    private static SessionFactory factory;
    private static SokoDBManager instance=new SokoDBManager() ;
    public static SokoDBManager getInstance() {
        return instance;
    }

    private SokoDBManager() {
        Configuration configuration = new Configuration();
        configuration.configure();
        factory = configuration.buildSessionFactory();
        }

    private static void searchScoresWhoseNameStartsWith(String prefix) {
        Session session = factory.openSession();
        Query query = session.createQuery("from SokoTable where Username LIKE :prefix");
        query.setParameter("prefix", prefix + "%");

        List<Score> list = query.list();
        for (Score e : list) {
            System.out.println(e.getUserName());
        }
        session.close();
    }


    public void addScore(Score score){
        Session session = null;
        Transaction tx = null;

        try {
            session = factory.openSession();
            tx = session.beginTransaction();

            session.save(score);
            tx.commit();            
        }
        catch (HibernateException ex) {
            if (tx != null)
                tx.rollback();
            System.out.println(ex.getMessage());
        }
        finally {
            if (session != null)
                session.close();
        }       

    }
    // Method to print all Scores
    public static ObservableList<Score> getScoreList(String Levelname) {
        Session session = factory.openSession();
        ObservableList<Score> list=null;

        try {       
            Query query = session.createQuery("from SokoDB.Score where Level =:Levelname Order by Steps");      
            query.setParameter("Levelname",Levelname);      
            list = FXCollections.observableArrayList(query.list());
            System.out.println(list.getClass());
            for (Score e : list) {
                System.out.println(e.getUserName());
            }
        } catch (HibernateException e) {
            e.printStackTrace();
        } finally { 
            session.close();            
        }
        return list;

    }


    public void close() {
        factory.close();
    }
}
公共类SokoDBManager{
私营静电厂;
私有静态SokoDBManager实例=新的SokoDBManager();
公共静态SokoDBManager getInstance(){
返回实例;
}
私有SokoDBManager(){
配置=新配置();
configure.configure();
factory=configuration.buildSessionFactory();
}
私有静态void searchScoresWhoseNameStartsWith(字符串前缀){
Session Session=factory.openSession();
Query Query=session.createQuery(“来自SokoTable,其中类似用户名:前缀”);
query.setParameter(“前缀”,前缀+“%”);
List=query.List();
对于(e分:列表){
System.out.println(e.getUserName());
}
session.close();
}
公共无效添加分数(分数){
会话=空;
事务tx=null;
试一试{
session=factory.openSession();
tx=session.beginTransaction();
会话。保存(分数);
tx.commit();
}
捕获(HibernateeException例外){
如果(tx!=null)
tx.回滚();
System.out.println(例如getMessage());
}
最后{
if(会话!=null)
session.close();
}       
}
//方法打印所有分数
公共静态ObservableList getScoreList(字符串级别名称){
Session Session=factory.openSession();
ObservableList=null;
试试{
Query Query=session.createQuery(“来自SokoDB.Score,其中Level=:Levelname按步骤排序”);
query.setParameter(“Levelname”,Levelname);
list=FXCollections.observearraylist(query.list());
System.out.println(list.getClass());
对于(e分:列表){
System.out.println(e.getUserName());
}
}捕获(休眠异常e){
e、 printStackTrace();
}最后{
session.close();
}
退货清单;
}
公众假期结束(){
工厂关闭();
}
}
例如,如果我将尝试运行以下代码:

ObservableList<Score> data=SokoDBManager.getScoreList("Level 1");
        for(Score e :data)
            System.out.println(e.getTime());
ObservableList data=SokoDBManager.getScoreList(“级别1”);
对于(e分:数据)
System.out.println(e.getTime());
我将得到以下错误:

Caused by: java.lang.ExceptionInInitializerError
    at view.SokobanViewer.openFile(SokobanViewer.java:64)
    ... 53 more
Caused by: org.hibernate.MappingException: Could not determine type for: javafx.beans.property.SimpleStringProperty, at table: SokoTable, for columns: [org.hibernate.mapping.Column(Level)]
    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:444)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
    at SokoDB.SokoDBManager.<init>(SokoDBManager.java:29)
    at SokoDB.SokoDBManager.<clinit>(SokoDBManager.java:21)
    ... 54 more
原因:java.lang.ExceptionInInitializeError
位于view.SokobanViewer.openFile(SokobanViewer.java:64)
... 53多
原因:org.hibernate.MappingException:无法确定以下列的类型:javafx.beans.property.SimpleStringProperty,位于表:SokoTable:[org.hibernate.mapping.Column(级别)]
位于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:444)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726)
SokoDB.SokoDBManager(SokoDBManager.java:29)
SokoDB.SokoDBManager(SokoDBManager.java:21)
... 54多
它是否与SimpleStringProperty相关? 此错误的原因可能是什么?我如何修复它? 谢谢

您希望Hibernate“看到”属性具有底层类型
String
int
,而不是JavaFX用于实现可观察性的类型(
StringProperty
IntegerProperty

如果在字段上放置
注释,Hibernate将使用
字段
访问类型
,即它将根据字段的类型匹配类型。要使用
属性的
AccessType
,其中Hibernate查看
get/set
方法,而不是字段,请改为注释
get
方法。还可以使用
access
注释显式指定访问类型

另外,请注意,您的实体的实现中有一个bug。如果调用默认构造函数,然后调用
set
方法(这正是Hibernate将要做的),就会得到一个空指针异常,因为您从未实例化属性实例。最好将这些设置为最终设置并内联实例化

@Entity(name="SokoTable")

// the next line is optional if you annotate the get methods (as done below):
@Access("AccessType.PROPERTY")

public class Score implements Serializable{

    private final IntegerProperty id = new SimpleIntegerProperty() ; 

    private final StringProperty userName = new SimpleStringProperty() ;
    private final StringProperty levelName = new SimpleStringProperty() ;
    private final IntegerProperty steps = new SimpleIntegerProperty() ;
    private final IntegerProperty time = new SimpleIntegerProperty() ;

    public Score(){ 
    }
    public Score(String userName, String levelName, int steps, int time) {
        super();
        setUserName(userName);
        setLevelName(levelName);
        setSteps(steps);
        setTime(time);
    }

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

    public void setId(int id) {
        this.id.set(id);
    }

    @Column(name="Username")
    public String getUserName() {
        return userName.get();
    }
    public void setUserName(String userName) {
        this.userName.set(userName);
    }
    @Column(name="Level")
    public String getLevelName() {
        return levelName.get();
    }
    public void setLevelName(String levelName) {
        this.levelName.set(levelName);
    }
    @Column(name="Steps")
    public int getSteps() {
        return steps.get();
    }
    public void setSteps(int steps) {
        this.steps.set(steps);
    }
    @Column(name="Time")
    public int getTime() {
        return time.get();
    }
    public void setTime(int time) {
        this.time.set(time);
    }   
}

请查看以了解更多详细信息

也许你需要某种转换器。。。