java - Hibernate:记录到数据库后无法获取数据

标签 java sql spring hibernate

我有愚蠢的错误、bug,或者我的无知中的漏洞。 可能是第三。

已解决: 来自 http://www.h2database.com/html/cheatSheet.html

Embedded
jdbc:h2:~/test 'test' in the user home directory
...
**In-Memory**
jdbc:h2:mem:test multiple connections in one process
...

因此,我创建了内存数据库,当您重新启动程序时,它会自动清理。

我通常有支持类(class):

@Entity
public class UserDetalis {
    @Id  @GeneratedValue(strategy = GenerationType.AUTO)
    private int userId;
    private String userName;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }
}

通常为 hibernate.cfg.xml

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">org.h2.Driver</property>
    <property name="connection.url">jdbc:h2:mem:db1</property>
    <property name="connection.username">sa</property>
    <property name="connection.password"></property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">10</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.H2Dialect</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">create</property>


    <mapping class="org.zyxerdima.dto.UserDetalis" />

</session-factory>

主类:

    ...
    Session session = sessionFactory.openSession();
    session.beginTransaction();
    for (int i = 0; i < 10; i++){
        UserDetalis user = new UserDetalis();
        user.setUserName("User " + (i + 1));
        session.save(user);
    }
    session.getTransaction().commit();
    session.close();

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

    Query query = session.createQuery("from UserDetalis");
    List users = query.list();
    session.getTransaction().commit();
    session.close();
    System.out.println(users.size());

执行,输出为:

...
10x Hibernate: insert into UserDetalis (userId, userName) values (null, ?)
Hibernate: select userdetali0_.userId as userId1_0_, userdetali0_.userName as userName2_0_ from UserDetalis userdetali0_
10 

10 - 数组的正确大小

此后我改变了

<property name="hbm2ddl.auto">update</property>

并且仅在主类中执行

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

    Query query = session.createQuery("from UserDetalis");
    List users = query.list();
    session.getTransaction().commit();
    session.close();
    System.out.println(users.size());

并接收

Hibernate: select userdetali0_.userId as userId1_0_, userdetali0_.userName as userName2_0_ from UserDetalis userdetali0_
0

为什么我得到 0? 为什么新运行后DB就清空了?

三个小时我都无法打败它。 谢谢。

最佳答案

<property name="connection.url">jdbc:h2:mem:db1</property>

上面似乎意味着您使用嵌入式数据库。它不是持久的,当您的应用程序关闭时,它会与您的应用程序一起消失。此类数据库最常用于测试目的。尝试一些持久性的,例如 PostgreSQL 或 MySql。

关于java - Hibernate:记录到数据库后无法获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333784/

相关文章:

MySQL innodb 过程在事务中仅事件一次(调用多次)

java - Spring session 碰撞 session

java - hibernate 更新始终为空

sql - 如何合并 SQLite 中每个表的所有公共(public)列

java - Spring 和 Hibernate 的 LazyInitialization 异常

java - suspend() 和resume() 中的线程问题

java - 如何在javamail api中上传文件作为附件?

sql - where中使用OR子句时会使用索引吗

java - 获取 CURRENT_TIMESTAMP 作为结果集的一部分

java - 在一定时间后退出程序 - Java