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);
}
}
请查看以了解更多详细信息 也许你需要某种转换器。。。