【问题标题】:Exception on persist new object持久化新对象的异常
【发布时间】:2019-01-30 15:01:03
【问题描述】:

将 JPA 与 Hibernate 和 HSQL 2.4.1 in-process 模式结合使用,当我尝试使用新客户端 persist\merge 时出现异常。但是当我尝试从 db 中选择客户端时,一切都很顺利。该表在应用程序启动时创建和填充。

Client client = new Client();
client.setFirstName("test2");
client.setSecondName("test2");
client.setPatronymic("test2");
client.setNumber("test2");
System.out.println(client);
entityManager.persist(client);

有了这个日志和堆栈跟踪:

2019-01-30T18:25:36.247+0400  WARN  SQL Error: -5501, SQLState: 42501
2019-01-30T18:25:36.248+0400  ERROR  user lacks privilege or object not found: HIBERNATE_SEQUENCE in statement [call next value for hibernate_sequence]
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare 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.firePersist(SessionImpl.java:811)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:789)
    at com.haulmont.testtask.Test.main(Test.java:21)

这里是我的实体类:

@Entity
@Table(name = "client")
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "first_name")
private String firstName;

@Column(name = "second_name")
private String secondName;

@Column(name = "patronymic")
private String patronymic;

@Column(name = "number")
private String number;

/**getters and setters**/
}

我的persistance.xml

<persistence-unit name="mainPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>com.haulmont.testtask.data.entity.Client</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:db-data/test_task;shutdown=true"/>
        <property name="javax.persistence.jdbc.user" value="SA"/>
        <property name="javax.persistence.jdbc.password" value=""/>

        <property name="javax.persistence.schema-generation.database.action" value="create"/>
        <property name="javax.persistence.schema-generation.create-source" value="script"/>
        <property name="javax.persistence.schema-generation.create-script-source" value="sql/create.sql"/>
        <property name="javax.persistence.sql-load-script-source" value="sql/import.sql"/>

        <property name="hibernate.hbn2ddl.import_files" value="sql/import.sql"/>
        <property name="hibernate.hbm2ddl.import_files_sql_extractor"
        value="org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>


    </properties>
</persistence-unit> 

【问题讨论】:

  • 您是否在代码中的任何位置使用hibernate_sequence?由于Hsqldb是区分大小写的,所以找不到它,检查它是大写还是小写需要什么

标签: java hibernate exception


【解决方案1】:

我找到solution。只需将生成策略从 AUTO 替换为 IDENTITY。

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2017-10-10
    相关资源
    最近更新 更多