微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

h2 数据库保留数据但在应用程序启动时重置

如何解决h2 数据库保留数据但在应用程序启动时重置

我正在尝试为 Java 项目工作的嵌入式数据库进行基本测试。就目前而言,我可以使用实体存储库对象将行保存到数据库中,在应用程序完成运行后,我可以使用 intellij 连接到数据库并查看这些行是否仍然存在。但是,如果我注释掉 save 方法并再次运行它,当我完成后检查数据库时,数据库是空的。

实体

package closet.utilities.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "outfits")
public class Outfit {

    @Id
    @Column(name = "id")
    String id;

    @Column(name = "inv_name")
    String invName;

    @Column(name = "display_name")
    String displayName;

    @Column(name = "owner")
    String owner;

    public Outfit() {
    }

    public Outfit(String id,String invName,String displayName,String owner) {
        this.id = id;
        this.invName = invName;
        this.displayName = displayName;
        this.owner = owner;
    }

    public String getId() {
        return id;
    }

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

    public String getInvName() {
        return invName;
    }

    public void setInvName(String invName) {
        this.invName = invName;
    }

    public String getdisplayName() {
        return displayName;
    }

    public void setdisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getowner() {
        return owner;
    }

    public void setowner(String owner) {
        this.owner = owner;
    }

    @Override
    public String toString() {
        return "Outfit{" +
                "id='" + id + '\'' +
                ",invName='" + invName + '\'' +
                ",displayName='" + displayName + '\'' +
                ",owner='" + owner + '\'' +
                '}';
    }
}

存储库

package closet.utilities.repositories;

import closet.utilities.entities.Outfit;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Optional;

public class OutfitRepository {

    private EntityManager entityManager;

    public OutfitRepository(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public Optional<Outfit> findById(String id) {
        Outfit outfit = entityManager.find(Outfit.class,id);
        return outfit != null ? Optional.of(outfit) : Optional.empty();
    }

    public List<Outfit> findAll() {
        return entityManager.createquery("from Outfit").getResultList();
    }

    public Optional<Outfit> save(Outfit outfit) {
        try {
            entityManager.getTransaction().begin();
            entityManager.persist(outfit);
            entityManager.getTransaction().commit();
            return Optional.of(outfit);
        } catch (Exception e) {
            // Todo logging
            e.printstacktrace();
        }
        return Optional.empty();
    }
}

主要方法

package closet.utilities;

import closet.utilities.entities.Outfit;
import closet.utilities.repositories.OutfitRepository;
import org.hibernate.Session;
import org.hibernate.Transaction;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.List;

public class Runnable {

    public static void main(String[] args) {

        // Create our entity manager
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("closet");
        EntityManager entityManager = entityManagerFactory.createEntityManager();


        Outfit outfit = new Outfit("Ramesh","Fadatare","rameshfadatare@javaguides.com","");
        Outfit outfit1 = new Outfit("John","Cena","john@javaguides.com","");
        OutfitRepository outfitRepository = new OutfitRepository(entityManager);
        //outfitRepository.save(outfit);
        //outfitRepository.save(outfit1);

        List<Outfit> outfits = outfitRepository.findAll();

        for (Outfit o : outfits) {
            System.out.println(o.getInvName());
        }

    }
}

持久性.xml

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                      http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="closet" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>closet.utilities.entities.Outfit</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
            <property name="javax.persistence.jdbc.url"    value="jdbc:h2:./data/closet" />
            <property name="javax.persistence.jdbc.user" value="sa" />
            <property name="javax.persistence.jdbc.password" value="" />

            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop" />
            <property name="show_sql" value="true"/>
            <property name="hibernate.temp.use_jdbc_Metadata_defaults" value="false"/>
        </properties>
    </persistence-unit>
</persistence>

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- JDBC Database connection settings -->
        <property name="connection.driver_class">org.h2.Driver</property>
        <property name="connection.url">jdbc:h2:./data/closet</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>
        <!-- JDBC connection pool settings ... using built-in test pool -->
        <property name="connection.pool_size">1</property>
        <!-- Select our sql dialect -->
        <property name="dialect">org.hibernate.dialect.H2Dialect</property>
        <!-- Echo the sql to stdout -->
        <property name="show_sql">true</property>
        <!-- Set the current session context -->
        <property name="current_session_context_class">thread</property>
        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create-drop</property>
        <!-- dbcp connection pool configuration -->
        <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="closet.utilities.entities.Outfit" />
    </session-factory>
</hibernate-configuration>

我只是按照 this tutorial 此处作为指南,以了解如何使其全部正常工作。基于此,我看不出我做错了什么。

解决方法

您使用:

<property name="hbm2ddl.auto">create-drop</property>

正如 documentation 中所述:

创建删除

删除架构并在 SessionFactory 启动时重新创建它。此外,在 SessionFactory 关闭时删除架构。

所以,这是预期的行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。