无法使用Hibernate保存数据库到H2数据库

时间:2019-03-02 17:18:18

标签: java hibernate maven

我无法使用hibernate 5和h2数据库将数据保存到h2数据库。 我正在使用Intellj idea最终版本。该数据库是使用idea数据库工具创建的。测试连接工作正常。

  

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="connection.url">jdbc:h2:./rms</property>
    <property name="connection.driver_class">org.h2.Driver</property>
    <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>

    <!--<property name="connection.username">user</property>-->
    <!--<property name="connection.password">user</property>-->

    <!-- DB schema will be updated if needed -->
     <property name="hbm2ddl.auto">update</property>
    <mapping class="models.UsersEntity"/>
  </session-factory>
</hibernate-configuration>
  

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.sagar</groupId>
    <artifactId>RestrauntManagementSystem</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.1.Final</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.198</version>
        </dependency>
    </dependencies>

</project>
  

UsersEntity.java

package models;

import javax.persistence.*;
import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name = "RMS_USERS", schema = "PUBLIC", catalog = "RMS")
public class UsersEntity {
    private long id;
    private String username;
    private String password;

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    @Column(name = "ID", unique = true)
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Basic
    @Column(name = "USERNAME", unique = true, nullable = false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "PASSWORD", nullable = false)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        UsersEntity that = (UsersEntity) o;

        if (id != that.id) return false;
        if (username != null ? !username.equals(that.username) : that.username != null) return false;
        if (password != null ? !password.equals(that.password) : that.password != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = (int) (id ^ (id >>> 32));
        result = 31 * result + (username != null ? username.hashCode() : 0);
        result = 31 * result + (password != null ? password.hashCode() : 0);
        return result;
    }
}
  

Main.java

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import models.UsersEntity;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


    public static void main(String[] args) {

        final StandardServiceRegistry standardServiceRegistry = new StandardServiceRegistryBuilder().configure().build();

        SessionFactory sessionFactory = new MetadataSources(standardServiceRegistry).buildMetadata().buildSessionFactory();

        Session session = sessionFactory.openSession();
        session.beginTransaction();

        UsersEntity usersEntity = new UsersEntity();
        usersEntity.setUsername("sagar");
        usersEntity.setPassword("tamang");

        session.save(usersEntity);
        session.getTransaction().commit();
        session.close();

        launch(args);
    }
}

每当我运行应用程序时,都会发生以下错误。根本不会保存到数据库。

/usr/lib/jvm/java-8-oracle/bin/java
-javaagent:/home/kazekage/Programs/idea-IU-183.5429.30/lib/idea_rt.jar=41025:/home/kazekage/Programs/idea-IU-183.5429.30/bin
-Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/home/kazekage/IdeaProjects/RestrauntManagementSystem/target/classes:/home/kazekage/.m2/repository/org/hibernate/hibernate-core/5.4.1.Final/hibernate-core-5.4.1.Final.jar:/home/kazekage/.m2/repository/org/jboss/logging/jboss-logging/3.3.2.Final/jboss-logging-3.3.2.Final.jar:/home/kazekage/.m2/repository/javax/persistence/javax.persistence-api/2.2/javax.persistence-api-2.2.jar:/home/kazekage/.m2/repository/org/javassist/javassist/3.24.0-GA/javassist-3.24.0-GA.jar:/home/kazekage/.m2/repository/net/bytebuddy/byte-buddy/1.9.5/byte-buddy-1.9.5.jar:/home/kazekage/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar:/home/kazekage/.m2/repository/org/jboss/spec/javax/transaction/jboss-transaction-api_1.2_spec/1.1.1.Final/jboss-transaction-api_1.2_spec-1.1.1.Final.jar:/home/kazekage/.m2/repository/org/jboss/jandex/2.0.5.Final/jandex-2.0.5.Final.jar:/home/kazekage/.m2/repository/com/fasterxml/classmate/1.3.4/classmate-1.3.4.jar:/home/kazekage/.m2/repository/javax/activation/javax.activation-api/1.2.0/javax.activation-api-1.2.0.jar:/home/kazekage/.m2/repository/org/dom4j/dom4j/2.1.1/dom4j-2.1.1.jar:/home/kazekage/.m2/repository/org/hibernate/common/hibernate-commons-annotations/5.1.0.Final/hibernate-commons-annotations-5.1.0.Final.jar:/home/kazekage/.m2/repository/javax/xml/bind/jaxb-api/2.3.1/jaxb-api-2.3.1.jar:/home/kazekage/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar:/home/kazekage/.m2/repository/org/glassfish/jaxb/txw2/2.3.1/txw2-2.3.1.jar:/home/kazekage/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.7/istack-commons-runtime-3.0.7.jar:/home/kazekage/.m2/repository/org/jvnet/staxex/stax-ex/1.8/stax-ex-1.8.jar:/home/kazekage/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.15/FastInfoset-1.2.15.jar:/home/kazekage/.m2/repository/com/h2database/h2/1.4.198/h2-1.4.198.jar sample.Main Gtk-Message: 22:57:05.286: Failed to load module "canberra-gtk-module" Mar 02, 2019 10:57:05 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {5.4.1.Final} Mar 02, 2019 10:57:06 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {5.1.0.Final} Mar 02, 2019 10:57:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!) Mar 02, 2019 10:57:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:./rms] Mar 02, 2019 10:57:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001001: Connection properties: {} Mar 02, 2019 10:57:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH10001003: Autocommit mode: false Mar 02, 2019 10:57:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init> INFO: HHH000115: Hibernate connection pool size: 20 (min=1) Mar 02, 2019 10:57:06 PM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect Mar 02, 2019 10:57:07 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@45394b31] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Mar 02, 2019 10:57:07 PM org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateService INFO: HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] Hibernate: 
    select
        max(ID) 
    from
        RMS_USERS Hibernate: 
    insert 
    into
        RMS.PUBLIC.RMS_USERS
        (PASSWORD, USERNAME, ID) 
    values
        (?, ?, ?) Mar 02, 2019 10:57:07 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 23505, SQLState: 23505 Mar 02, 2019 10:57:07 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Unique index or primary key violation: "PUBLIC.UK_59HEUM0SN7LLCEW3CL5FKFBEL_INDEX_8 ON PUBLIC.RMS_USERS(USERNAME) VALUES 1"; SQL statement: insert into RMS.PUBLIC.RMS_USERS (PASSWORD, USERNAME, ID) values (?, ?, ?) [23505-198] Mar 02, 2019 10:57:07 PM org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure ERROR: HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement] 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:498)     at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)     at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)     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:498)     at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement  at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)   at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)   at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)   at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1490)    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:515)    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3348)   at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2519)    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:473)     at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:178)  at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:39)     at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:271)   at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:104)   at sample.Main.main(Main.java:40)   ... 11 more Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)  at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)     at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)   at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3175)     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3689)     at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:90)     at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)     at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1484)    ... 20 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PUBLIC.UK_59HEUM0SN7LLCEW3CL5FKFBEL_INDEX_8 ON PUBLIC.RMS_USERS(USERNAME) VALUES 1"; SQL statement: insert into RMS.PUBLIC.RMS_USERS (PASSWORD, USERNAME, ID) values (?, ?, ?) [23505-198]     at org.h2.message.DbException.getJdbcSQLException(DbException.java:457)     at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)     at org.h2.message.DbException.get(DbException.java:205)     at org.h2.message.DbException.get(DbException.java:181)     at org.h2.index.BaseIndex.getDuplicateKeyException(BaseIndex.java:103)  at org.h2.mvstore.db.MVSecondaryIndex.checkUnique(MVSecondaryIndex.java:220)    at org.h2.mvstore.db.MVSecondaryIndex.add(MVSecondaryIndex.java:196)    at org.h2.mvstore.db.MVTable.addRow(MVTable.java:703)   at org.h2.command.dml.Insert.insertRows(Insert.java:180)    at org.h2.command.dml.Insert.update(Insert.java:132)    at org.h2.command.CommandContainer.update(CommandContainer.java:133)    at org.h2.command.Command.executeUpdate(Command.java:267)   at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200)  at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154)  at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)   ... 28 more Exception running application sample.Main

Process finished with exit code 1

1 个答案:

答案 0 :(得分:1)

错误消息指出...Failed to load module "canberra-gtk-module"...。如果您的操作系统是linux,则安装gtkgtk3模块应该可以解决此问题。

sudo apt install libcanberra-gtk-module libcanberra-gtk3-module

(摘自here