0

我想知道在 spring mvc + hibernate 应用程序中添加固定装置以用于开发目的的最佳方法是什么。基本上,这个想法是当应用程序在“开发”环境中加载时,一组固定装置应该预先填充数据库。有几个考虑因素是我不想使用 DbUnit 或加载硬编码的 sql,而是想使用实体管理器在应用程序内部生成固定装置,以便在需要时使用某些服务来生成信息(让假设我想创建一些用户固定装置,id 喜欢能够使用 salt 服务等来生成密码等等)。理想情况下,我希望能够为每种域类型将不同类中的固定装置分开。到目前为止,我还没有找到任何有帮助的东西?我很感激任何帮助,请记住,我是一个完整的 Spring 新手,来自 PHP 背景,所以请详细说明应该去哪里:S。谢谢!

4

1 回答 1

1

这是为了开发吧?不只是用于单元或集成测试?如果是这样,我想我会创建一个带有 main 的 Java 类,然后将您的数据创建代码放在那里。您还可以使该类与数据填充 bean 自动连接。然后让所有数据填充器实现相同的接口。确保你的主要方法是这样注释的:

@ContextConfiguration( "classpath:/META-INF/spring/applicationContext.xml")

这实际上将为您的静态主要方法加载弹簧配置。

然后,您可以在每次擦除数据库后让构建运行它,或者在需要填充数据时手动调用它。

如果这只是用于单元测试,那么我会在您的测试源路径中创建一个数据填充器,然后从您的测试 #setUp 方法中调用它。

考虑以下:

public interface Populator {
   void run();
}

@Repository
public class UserPopulator {
   @PersistenceContext
   private EntityManager em;

   @Transactional
   public void run() {
      create some users
      em.persist( users );
   }
}


@Repository
public class ThingPopulator {
   @PersistenceContext
   private EntityManager em;

   @Transactional
   public void run() {
      create some thing
      em.persist( thing );
   }
}

@Configurable
@ContextConfiguration( "classpath:/META-INF/spring/applicationContext.xml")
public class DataPopulator {
   @Autowired
   private List<Populator> populators;

   public void run() {
      for ( Populator populator : populators ) {
         populator.run();
      }
   }

   public static void main(String[] args) {
      new DataPopulator().run();
   }
}

然后你可以运行这个类进行开发。如果您有一个仅针对用户的单元测试,您还可以执行以下操作:

public class UserTest {
   @Before
   public void setUp() {
      new UserPopulator().run();
   }

   // tests
}

或类似的东西。

于 2013-02-03T19:04:46.190 回答