java - 如何在没有 xml 的 Dropwizard HibernateBundle 类上设置命名策略?

标签 java hibernate dropwizard

我正在开发一个项目,该项目使用 dropwizard 的 hibernate 包根据以下文档获取 session 工厂:

http://www.dropwizard.io/0.7.1/docs/manual/hibernate.html

该项目不使用任何 xml,仅使用带注释的类来配置 bundle,就像示例中一样。

public class ExampleConfiguration extends Configuration {
     @Valid
     @NotNull
     @JsonProperty("database")
     private DataSourceFactory database = new DataSourceFactory();

     public DataSourceFactory getDataSourceFactory() {
         return database;
     }
}

private final HibernateBundle<ExampleConfiguration> hibernate = 
new HibernateBundle<ExampleConfiguration>(
    some.class
    ) {
    @Override
    public DataSourceFactory getDataSourceFactory(ExampleConfiguration configuration) {
    return configuration.getDataSourceFactory();
    }
};

但是,我们有一个用例,我需要在 DAO 对象的表名前加上环境,以便覆盖 @Table 注释。

根据以下文档,我有一个实现 ImprovedNamingStrategy 的类

http://docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/cfg/ImprovedNamingStrategy.html

但是我如何将命名策略挂接到我的 dropwizard hibernate 包中。我希望能够做这样的事情......

hibernateBundle.setNamingStrategy(ImprovedNamingStrategy.Instance)

hibernateBundle.addAnnotatedClass(someHibernateNamingPropertyConfig)

https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/cfg/Configuration.html#setNamingStrategy(org.hibernate.cfg.NamingStrategy)

但是,hibernateBundle API 不允许这样做。

翻看HibernateBundle的源码

https://github.com/dropwizard/dropwizard/blob/master/dropwizard-hibernate/src/main/java/io/dropwizard/hibernate/HibernateBundle.java

你可以看到它使用了“import io.dropwizard.Configuration;”与确实公开所有这些方法的 org.hibernate.cfg 相反。我试图避免重大重构,因此如果有一种“hacky”方式强制设置 bundle 的命名属性,那么我可以接受。

任何关于从这里去哪里的想法都将不胜感激。

最佳答案

在 Dropwizard 0.8.4 中找到了适合我的解决方案。不确定它是否可以帮助您使用 Dropwizard 0.7.1,但它肯定会对来自 Google 的读者有同样的问题有帮助。

您可以扩展 HibernateBundle 并覆盖 configure()。在构建 SessionFactoryFactory 之前调用此方法,并为其使用 Configuration 对象。然后,您可以覆盖该方法以添加您可能需要的任何特殊配置。

例子:

public abstract class DatabaseWithImprovedNamingStrategyBundle extends ScanningHibernateBundle {
  public DatabaseWithImprovedNamingStrategyBundle(String pckg) {
    super(pckg);
  }

  @Override
  protected void configure(Configuration configuration) {
    super.configure(configuration);
    configuration.setNamingStrategy(ImprovedNamingStrategy.INSTANCE);
  }
}

此示例使用 ScanningHibernateBundle,因为它是我使用的那个,但您也可以直接使用 HibernateBundle。

关于java - 如何在没有 xml 的 Dropwizard HibernateBundle 类上设置命名策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41992014/

相关文章:

java - matplotlib imagesc 类似于 java

java - hibernate session 工厂

java - 如何将 DAO 与 hibernate/jpa 一起使用?

java - 获取用于 Dropwizard 集成测试的 SecurityContext

java - 每次进行更改时都运行 mvn package 吗?

java - 为所有组件Java设置相同的字体

java - 即时创建面板?

java - Travis CI 找不到 Ivy jarfile

mysql - "count"中的高级条件查询

json - 使用 Dropwizard 时配置 Jackson 映射器