我正在开发一个项目,该项目使用 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)
但是,hibernateBundle API 不允许这样做。
翻看HibernateBundle的源码
你可以看到它使用了“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/