mysql - 在数据库 Play Framework jpa中插入初始数据

标签 mysql sql jpa playframework sql-insert

我正在使用带有 jpa mysql 的 play 2.3。我的数据库中有一个管理员,最初应该在创建数据库时创建。我发现 this关于它的线程。所以我的 persistence.xml 看起来像

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
             version="2.1">

    <persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <non-jta-data-source>DefaultDS</non-jta-data-source>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="javax.persistence.sql-load-script-source"
                      value="META-INF/sql/data.sql"/>
        </properties>

    </persistence-unit>

</persistence>

然后我在META-INF/sql/data.sql中创建了一个sql文件

INSERT INTO `roles` (`id`, `name`) VALUES(1, 'supersuperadmin')

但是当我运行我的应用程序时,它会创建数据库,但它会在roles 表中插入任何内容。

我也曾尝试创建 evolutions/default/1.sql2.sql 文件,但没有显示任何内容。

所以我做错了什么。如何在我的数据库中插入初始数据?

最佳答案

您可以在 Global 中使用 onStart 方法,并在每次您的应用程序启动时检查您的管理员是否已在您的数据库中创建。

public class Global extends GlobalSettings {

    @Override
    public void onStart(Application app) {
        checkAdmin();
    }

    private void checkAdmin() {
        // You have to start the transaction by hand - can't use @transactional
        JPA.withTransaction(() -> {
            // Check if admin exists in DB
            UserModel admin = JPA.em().find(UserModel.class, "admin");
            if (admin == null) {
                admin = // Create your admin here
                JPA.em().persist(admin);
            }
        });
    }
}

关于mysql - 在数据库 Play Framework jpa中插入初始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31716862/

相关文章:

mysql - 使用mysql从表中提取父子列表

php - 只进行一次查询并将其存储在数组中或每次都进行查询是否更有效?

java - 为什么 JPA 实体中的属性不允许使用 "public"?

java - 创建实体和非实体对象之间的关系

hibernate - 在 SLSB 中使用 EJB3 和实体管理器处理 ConstraintViolationException 的最佳方法是什么

php - 如何将一条信息插入到已有的记录中?

mysql find_in_set 数组分隔符

sql - 每周在 SQL Server 中获得新客户

java - SQL - 按日期循环行的最佳实践方法

sql - Select Into 和 Insert Into from old table 的区别?