1

在我的应用程序中,我使用 Spring 上下文和 JPA。我有一组带有注释的实体@Entity,它们的表是在系统启动期间自动创建的。最近我开始使用 Spring ACL,所以我必须有以下额外的 DB 模式,并且我不希望将这些表映射到实体(只是我不需要它们,因为 Spring ACL 独立管理它们)。

  1. 我想自动将管理员用户帐户插入到 User实体表中。如何正确地做到这一点?
  2. 我想在系统启动期间初始化 Spring ACL 自定义表,但是 SQL 脚本文件似乎不是一个好的解决方案,因为如果我使用不同的数据库进行生产和功能测试,不同的 SQL 方言不允许我在两者上正确执行脚本引擎(例如,当使用 MySQL 和 HSQL 时)。

起初我尝试ServletListener在 servlet 初始化期间使用它检查数据库并添加必要的数据和模式,但这不适用于集成测试(因为根本不涉及 servlet)。

我想要实现的是在 JPA 初始化所有实体表之后启动的 Spring bean (?),使用注入的 DAO 插入所有启动数据并以某种方式创建 Spring ACL 模式。然后 - 我希望将 bean 从 IoC 中删除(因为我不再需要它了)。是否可以?

或者有没有更好的方法来做到这一点?

4

5 回答 5

2

默认 JPA 允许您在加载 persistence.xml 时添加 SQL 脚本:

http://docs.oracle.com/javaee/7/tutorial/persistence-intro005.htm

将此属性添加到您的 persistence.xml 文件中:

   <property name="javax.persistence.sql-load-script-source"
              value="META-INF/sql/data.sql" />

并用您的默认值填充 data.sql 文件。

于 2016-04-11T09:08:28.200 回答
1

如果您使用的是 EclipseLink,则可以在 JPA 登录后使用 SessionEventListener 来执行代码。您可以在 postLogin 事件中执行架构创建和设置。

您可以使用 EclipseLink (org.eclipse.persistence.tools.schemaframework) 中的架构框架以独立于数据库平台的方式创建表和 DDL。(TableDefinition、SchemaManager 类)

于 2013-01-15T14:20:42.597 回答
1

我使用PostConstruct注释来调用初始化方法。

如文档所述:PostConstruct 注释用于需要在完成依赖注入以执行任何初始化后执行的方法。 您可以简单地添加一个带有 @PostConstruct 注解的方法的 spring bin,这些方法将在创建表后执行(或者我们可以说,它们在其他 bean 准备好之后执行)。

代码示例:

@Component
public class EntityLoader {

    @Autowired
    UserRepository userRepo;

    @PostConstruct
    public void initApiUserData() {
        User u = new User();
        // set user properties here
        userRepo.save(u);
    }

}
于 2015-04-20T04:57:55.550 回答
0

如果你使用hibernate,那么import.sql在类路径根目录下创建一个sql脚本。Hibernat 将在启动时执行它。- 这在以前的休眠版本中有效。在当前版本 4.1 的文档中,我没有发现任何有关此功能的提示。

但是 Hibernate 4.1 还有一个特性

财产:hibernate.hbm2ddl.import_files

包含在 SessionFactory 创建期间执行的 SQL DML 语句的可选文件的逗号分隔名称。这对于测试或演示很有用:例如,通过添加 INSERT 语句,您可以在部署数据库时使用最少的数据集填充数据库。文件顺序很重要,给定文件的语句在以下文件的语句之前执行。这些语句仅在创建模式时执行,即如果 hibernate.hbm2ddl.auto 设置为 create 或 create-drop。

例如 /humans.sql,/dogs.sql

于 2013-01-15T12:40:00.280 回答
0

你可以尝试使用flyway

  • 使用 SQL DDL 创建表作为 SQL 迁移和
  • 可能使用基于 SQL 或 Java 的迁移将一些数据放入表中。如果需要环境或其他信息,您可能想要使用后者。

这比听起来要容易得多,如果不是必须的话,您最终也会获得飞行路线本身作为奖励。

于 2013-12-09T04:19:53.397 回答