2017-04-09 79 views
1

這個問題已經被問過很多次,但沒有一個答案似乎幫助我的人,所以我會再試一次詢問,並希望運氣:Hibarnate org.hibernate.MappingException:無法確定類型SimpleStringProperty

我有類分數

@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(); 
    } 
} 

例如,如果我會嘗試運行這段代碼:

ObservableList<Score> data=SokoDBManager.getScoreList("Level 1"); 
     for(Score e :data) 
      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 

是它涉及到SimpleStringProperty? 什麼可能是這個錯誤的原因,我該如何解決它? 感謝

+0

可能你需要某種轉換器... – fabian

回答

1

你想休眠「看到」的屬性爲具有基礎類型Stringint,不用於JavaFX的通過(StringPropertyIntegerProperty)實現可觀測的類型。

如果將Column註釋放在字段上,休眠將使用AccessType,FIELD,即它將根據字段的類型匹配類型。要使用PROPERTYAccessType(其中Hibernate查看get/set方法而不是字段),請改爲註釋get方法。您還可以使用Access批註明確指定訪問類型。

另外,請注意,您在實體的實現中存在一個錯誤。如果您調用默認構造函數,然後使用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); 
    } 
} 

查看更多詳情,請看this blog post

相關問題