Hibernate 无法生成 id

Posted

技术标签:

【中文标题】Hibernate 无法生成 id【英文标题】:Hibernate can't generate id 【发布时间】:2016-12-09 14:53:04 【问题描述】:

我在 IntelliJ IDEA 上创建了一个新项目,使用 hibernate (+ hibernate entitymanager) 5、hsqldb 1.8(仅用于测试)以及 junit 4。

我有我的测试课

UserRoundRelationsTest

EntityManagerFactory emf;
EntityManager em;

Date currentDate;
User user;
Round round1;
Round round2;

还有一些@After 和@Before 方法:

@Before
public void saveDummyUserAndTwoDummyRounds() 

    emf = Persistence.createEntityManagerFactory("testPersistence");
    em = emf.createEntityManager(); // Retrieve an application managed entity manager

    currentDate = new Date();
    user = new User.UserBuilder("alias").fullName("Full Name").phoneNumber("Phone Number").height(100).weight(100).birthDate(currentDate).build();

    round1 = new Round(new GameMode(1, ButtonTargetStrategy.RANDOM, ButtonSkipStrategy.SKIP_ON_MISTAKE));
    round2 = new Round(new GameMode(2, ButtonTargetStrategy.RANDOM, ButtonSkipStrategy.SKIP_ON_MISTAKE));

    round1.setUser(user);
    round2.setUser(user);

    HashSet<Round> rounds = new HashSet<Round>(2);
    rounds.add(round1);
    rounds.add(round2);

    em.getTransaction().begin();

    user.setRounds(rounds);

    em.persist(user);
    em.persist(round1);
    em.persist(round2);

    em.flush();
    em.getTransaction().commit();

@After
public void deleteData() 

    em.remove(user);
    em.remove(round2);
    em.remove(round2);

    em.getTransaction().commit();

    em.close();
    emf.close();

首先,当我尝试运行测试时,hibernate 找不到 User 和 Round 类的表,以及它们所依赖的所有内容(例如名为 ButtonPress 的类)。我认为这是由于我在 persistence.xml

中配置的自动创建删除造成的
<persistence-unit name="testPersistence">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <class>com.carloworks.model.User</class>
    <class>com.carloworks.model.Round</class>
    <class>com.carloworks.model.ButtonPress</class>
    <properties>
        <!--<property name="hibernate.archive.autodetection" value="class,hbm"></property>-->

        <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"></property>
        <property name="hibernate.show_sql" value="true"></property>
        <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"></property>
        <property name="hibernate.connection.username" value="sa"></property>
        <property name="hibernate.connection.password" value=""></property>
        <property name="hibernate.connection.url"
                  value="jdbc:hsqldb:mem:buttonMasherModelsTestDb;MV_STORE=FALSE;MVCC=FALSE"></property>
        <!--<property name="hibernate.default_schema" value="buttonMasherModelsTestDb"/>-->
        <property name="hibernate.hbm2ddl.auto" value="create-drop"></property>
    </properties>
</persistence-unit>

进一步向下滚动错误日志,我也在这一行得到一个错误:

em.persist(user);

空标识符(加上“不支持此函数”/“GenericJDBCException:无法准备语句”)。

我做错了什么?

该项目也可通过Github获得

完整的Error Log

【问题讨论】:

HSQLDB 1.8 已经有好几年了。尝试来自 SourceForge 或来自 Maven 的最新 HSQLDB oss.sonatype.org/content/repositories/releases/org/hsqldb/… @fredt 我正在更新此内容 @fredt 我改变了版本,同样的事情 再次更改版本并修复了 jar 的根路径(intellij 非常好:P)。完成 【参考方案1】:

将版本更改为最新版本解决了问题 *有些可能会遇到损坏的路径错误(由 maven 引起)。如果您使用的是 intelliJ,请导航到项目设置 -> 模块并修复“问题”选项卡下的任何问题。

【讨论】:

以上是关于Hibernate 无法生成 id的主要内容,如果未能解决你的问题,请参考以下文章

为 Eclipse 安装了 Hibernate Tools 插件,但无法访问代码生成功能

我无法生成自动递增的Id,而hibernate总是生成1作为Id

Java 11:OSGi:生成 EntityManager,无法构建 Hibernate SessionFactory java.lang.ClassNotFoundException:org.hib

无法使用 hibernate3-maven-plugin-3.0 生成 hbm2ddl

JPA/Hibernate 无法创建名为 Order 的实体

仅生成 Hibernate Envers 的审计表