【问题标题】:Not able to save data using Hibernate无法使用 Hibernate 保存数据
【发布时间】:2021-07-14 03:23:50
【问题描述】:

我正在学习 Hibernate,但被困在第一步。下面是我的实体类。

@Entity
public class UserDetails {

    @Id
    private int userId;
    private String userName;
    
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

下面是我的测试课。

UserDetails user = new UserDetails();
user.setUserId(1);
user.setUserName("Abhinash");

//creating hibernate session factory
Configuration config = new Configuration();
config.configure();
// local SessionFactory bean created
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
//before saving data in db, we need to open a transaction
session.beginTransaction();
session.save(user);

//once save is done, we need to end the transaction.
session.getTransaction().commit();

以下是错误日志跟踪:

Hibernate: 创建表 UserDetails (userId integer not null, userName varchar(255), primary key (userId)) engine=MyISAM 警告:GenerationTarget 遇到异常接受命令:通过 JDBC 语句执行 DDL“创建表 UserDetails(userId integer not null, userName varchar(255), primary key (userId)) engine=MyISAM”时出错 org.hibernate.tool.schema.spi.CommandAcceptanceException:通过 org.hibernate.tool 的 JDBC 语句执行 DDL“创建表 UserDetails(userId integer not null, userName varchar(255), primary key (userId)) engine=MyISAM”时出错.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:67) at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applySqlString(SchemaCreatorImpl.java:439) at org.hibernate.tool.schema.internal.SchemaCreatorImpl .applySqlStrings(SchemaCreatorImpl.java:423) 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.createFromMetadata(SchemaCreatorImpl.java:314) 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:166) 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:135) 在 org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:121) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:156) 在 org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) 在 org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:318) 在 org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724) 在 org.tutorial.hibernate.HibernateTest.main(HibernateTest.java:19) 引起:org.postgresql.util.PSQLException:错误:“引擎”处或附近的语法错误 位置:97 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323) 在 org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473) 在 org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393) 在 org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:322) 在 org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:308) 在 org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:284) 在 org.postgresql.jdbc.PgStatement.execute(PgStatement.java:279) 在 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ... 13 更多

Hibernate: insert into UserDetails (userName, userId) values (?, ?)
ERROR: ERROR: relation "userdetails" does not exist
  Position: 13
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: 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:1366)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:453)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3212)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2380)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:447)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
    at org.tutorial.hibernate.HibernateTest.main(HibernateTest.java:26)
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:103)
    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:200)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3297)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3824)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:107)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
    at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478)
    at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:345)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:93)
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1362)
    ... 9 more
Caused by: org.postgresql.util.PSQLException: ERROR: relation "userdetails" does not exist
  Position: 13

下面是我的cfg文件:

<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">thread</property>
<property name="hibernate.hbm2ddl.auto">create</property>
<property name="hibernate.dbcp.initialSize">5</property>
<property name="hibernate.dbcp.maxTotal">20</property>
<property name="hibernate.dbcp.maxIdle">10</property>
<property name="hibernate.dbcp.minIdle">5</property>
<property name="hibernate.dbcp.maxWaitMillis">-1</property>
<mapping class="org.tutorial.hibernate.model.UserDetails" />

提前致谢!!

【问题讨论】:

  • 你的 Postgres 版本是什么?
  • 删除现有方言并添加此方言
  • 使用 MySQL5Dialect 的愚蠢错误。感谢您的回答。
  • 如果对你有帮助,请点赞我的评论。

标签: java hibernate


【解决方案1】:

关键信息是:

错误:关系“userdetails”不存在

这表明您的 Hibernate 配置自动创建表。您要么需要手动创建表,要么添加以下休眠属性:

 hibernate.hbm2ddl.auto=update

【讨论】:

  • 我在 cfg 文件中有以下属性: create 虽然,我添加了上述内容,但出现了同样的错误。同时添加 cfg 文件内容。
猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 2017-12-08
  • 2013-06-15
  • 2023-04-03
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多