JavaFX 桌面应用程序 - 使用 HSQLDB(嵌入式)和 Hibernate

标签 java hibernate javafx hsqldb

有关于使用 HSQLDB、Hibernate 和 JavaFX 的好的教程吗?我正在使用 Eclipse 作为我的 IDE。我的项目模型的变量定义如下:

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO)
 @Column(name = "PROJECTID")
 private long projectId;

 @Column(name = "PROJECTNAME")
 private final StringProperty projectName;

 @Column(name = "PROJECTJIBP")
 private final StringProperty projectJIBP;

这是将 Hibernate 与 JavaFX 结合使用的有效方法吗?

persistance.xml 是:

    <?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
  <persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <class> handwrittencode.eiar.model.Project</class>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
      <property name="javax.persistence.jdbc.url"    value="jdbc:hsqldb:mem:test" />
      <property name="javax.persistence.jdbc.user" value="sa" />
      <property name="javax.persistence.jdbc.password" value="" />
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="show_sql" value="true"/>
      <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false"/>
    </properties>
  </persistence-unit>
</persistence>

我收到此错误消息:

  Jun 28, 2014 7:53:27 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Jun 28, 2014 7:53:27 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Jun 28, 2014 7:53:27 PM org.hibernate.ejb.HibernatePersistence logDeprecation
WARN: HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Jun 28, 2014 7:53:27 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: test
    ...]
Jun 28, 2014 7:53:27 PM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {4.3.5.Final}
Jun 28, 2014 7:53:27 PM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Jun 28, 2014 7:53:27 PM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Jun 28, 2014 7:53:28 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {4.0.4.Final}
Jun 28, 2014 7:53:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Jun 28, 2014 7:53:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [org.hsqldb.jdbcDriver] at URL [jdbc:hsqldb:mem:test]
Jun 28, 2014 7:53:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=sa}
Jun 28, 2014 7:53:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
Jun 28, 2014 7:53:28 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Jun 28, 2014 7:53:28 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.HSQLDialect
Jun 28, 2014 7:53:28 PM org.hibernate.engine.jdbc.internal.LobCreatorBuilder useContextualLobCreation
INFO: HHH000422: Disabling contextual LOB creation as connection was null
Initial SessionFactory creation failed.javax.persistence.PersistenceException: [PersistenceUnit: test] Unable to build Hibernate SessionFactory
Exception in Application constructor
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class handwrittencode.eiar.MainApp
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:884)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.sun.javafx.application.LauncherImpl$7.run(LauncherImpl.java:791)
    at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
    ... 1 more
Caused by: java.lang.ExceptionInInitializerError
    at handwrittencode.eiar.util.EntityManagerUtil.<clinit>(EntityManagerUtil.java:16)
    at handwrittencode.eiar.MainApp.<init>(MainApp.java:32)
    ... 15 more
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: test] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1225)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.access$600(EntityManagerFactoryBuilderImpl.java:119)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:853)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at handwrittencode.eiar.util.EntityManagerUtil.<clinit>(EntityManagerUtil.java:12)
    ... 16 more
Caused by: org.hibernate.MappingException: Could not determine type for: javafx.beans.property.StringProperty, at table: PROJECT, for columns: [org.hibernate.mapping.Column(projectAddress)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:336)
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:310)
    at org.hibernate.mapping.Property.isValid(Property.java:241)
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:496)
    at org.hibernate.mapping.RootClass.validate(RootClass.java:270)
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1358)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1849)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    ... 24 more
Exception running application handwrittencode.eiar.MainApp

编辑

package handwrittencode.eiar.model;

import java.time.LocalDate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import handwrittencode.eiar.util.LocalDateAdapter;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;


@Entity
@Table(name = "PROJECT")
public class Project {


     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "PROJECTID")
     private long projectId;

     private final StringProperty projectName;
     private final StringProperty projectJIBP;
     private final StringProperty projectState;
     private final StringProperty projectAddress;
     private final StringProperty projectManager;

     private final ObjectProperty<LocalDate> projectCreated;
     private final ObjectProperty<LocalDate> projectStart;
     private final ObjectProperty<LocalDate> projectEnd;


     public Project()
     {
         this(null,null,null,null,null);
     }

     public Project(String projectName, String projectJIBP, String projectState, String projectAddress, String projectManager)
     {
         this.projectName =  new SimpleStringProperty(projectName);
         this.projectJIBP =  new SimpleStringProperty(projectJIBP);
         this.projectState =  new SimpleStringProperty(projectState);
         this.projectAddress = new SimpleStringProperty(projectAddress);
         this.projectManager = new SimpleStringProperty(projectManager);


         this.projectCreated =  new SimpleObjectProperty<LocalDate>(LocalDate.of(1999, 2, 21));
         this.projectStart = new SimpleObjectProperty<LocalDate>(LocalDate.of(1999, 2, 21));
         this.projectEnd = new SimpleObjectProperty<LocalDate>(LocalDate.of(1999, 2, 21));




     }


     @Column(name = "PROJECTNAME")
     public String getProjectName() {
            return projectName.get();
     }

     public void setProjectName(String projectName) {
            this.projectName.set(projectName);
     }

     public StringProperty projectNameProperty() {
            return this.projectName;
     }

     /**/

     @Column(name = "PROJECTJIBP")
     public String getProjectJIBP(){
         return projectJIBP.get();
     }

     public void setProjectJIBP(String projectJIBP) {
            this.projectJIBP.set(projectJIBP);
     }

     public StringProperty projectJIBPProperty() {
            return this.projectJIBP;
     }

   /**/

     @Column(name = "PROJECTSTATE")
     public String getProjectState(){
         return projectState.get();
     }

     public void setProjectState(String projectState) {
            this.projectState.set(projectState);
     }

     public StringProperty projectStateProperty() {
            return this.projectState;
     }

     /**/

     @Column(name = "PROJECTADDRESS")
     public String getProjectAddress(){
         return projectAddress.get();
     }

     public void setProjectAddress(String projectAddress) {
            this.projectAddress.set(projectAddress);
     }

     public StringProperty projectAddressProperty() {
            return this.projectAddress;
     }

     /**/

     @Column(name = "PROJECTMANAGER")
     public String getProjectManager(){
         return projectManager.get();
     }

     public void setProjectManager(String projectManager) {
            this.projectManager.set(projectManager);
     }

     public StringProperty projectManagerProperty() {
            return this.projectManager;
     }


     /**/

     @XmlJavaTypeAdapter(LocalDateAdapter.class)
        public LocalDate getProjectCreated() {
            return projectCreated.get();
        }

        public void setProjectCreated(LocalDate projectCreated) {
            this.projectCreated.set(projectCreated);
        }

        public ObjectProperty<LocalDate> projectCreatedProperty() {
            return projectCreated;
        }


     /**/

     @XmlJavaTypeAdapter(LocalDateAdapter.class)
        public LocalDate getProjectStart() {
            return projectStart.get();
        }

        public void setProjectStart(LocalDate projectStart) {
            this.projectStart.set(projectStart);
        }

        public ObjectProperty<LocalDate> projectStartProperty() {
            return projectStart;
        }

      /**/

        @XmlJavaTypeAdapter(LocalDateAdapter.class)
        public LocalDate getProjectEnd() {
            return projectEnd.get();
        }

        public void setProjectEnd(LocalDate projectEnd) {
            this.projectEnd.set(projectEnd);
        }

        public ObjectProperty<LocalDate> projectEndProperty() {
            return projectEnd;
        }


}

最佳答案

Is this valid way of using Hibernate with JavaFX ?

否:使用属性访问而不是字段访问:

private final StringProperty projectName;

@Column(name = "PROJECTNAME")
public final String getProjectName() {
    return projectName.get();
}

public final void setProjectName(String projectName) {
    this.projectName.set(projectName);
}

public StringProperty projectNameProperty() {
    return projectName;
}

等等...

这使得 Hibernate 能够根据 get 方法的返回类型来确定类型,而不是根据实际字段的类型;因此它可以保留 String 而不是 StringProperty,等等。

参见Steven Van Impe's blogmy blog

关于JavaFX 桌面应用程序 - 使用 HSQLDB(嵌入式)和 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24469537/

相关文章:

java - Java 中的 session 超时(使用 Spring Boot 和 Hazelcast)

java - RSA - 客户端(在服务器上下文中)如何加密/解密传入数据?

java - Spring Data JPA(CrudRepository)-BeanCreationException : Could not autowire field

java - 无法使用 FXMLLoader#setRoot

css - JavaFX - 无法从元素内加载图像

JavaFX如何通过button.setOnAction改变场景的大小

java - Jetty、Jersey 和 Spring 的 NoInitialContextException

java - 如果可以选择向现有系统添加单元测试或集成测试,从哪个开始更好,为什么?

java - 在 Spring Web 中更新/通知其他用户

java - Hibernate 共享实体竞争条件