我正在处理一个项目,该项目使用dropwizard的hibernate捆绑包根据以下文档获取会话工厂:
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
但是如何将命名策略挂接到我的dropwizardhibernate捆绑包中呢。我希望能够做这样的事情。。。
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不允许这样做。
浏览Hibernate Bundle 的源代码
https://github.com/dropwizard/dropwizard/blob/master/dropwizard-hibernate/src/main/java/io/dropwizard/hibernate/HibernateBundle.java
您可以看到,它使用了"import-io.dropwizard.Configuration;",而org.hibernate.cfg公开了所有这些方法。我试图避免进行重大重构,所以如果有一种"巧妙"的方法来强制设置捆绑包的命名属性,那么我可以接受。
任何关于从这里去哪里的想法都将不胜感激。
在Dropwizard 0.8.4中找到了一个适合我的解决方案。不确定它是否能帮助你使用Dropwizard0.7.1,但它肯定会对来自谷歌的有同样问题的读者有所帮助。
您可以扩展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);
}
}
这个例子使用了ScanningHibernate Bundle,因为它是我使用的,但你也可以直接使用Hibernate Bundle。
我刚刚决定不使用Hibernate Bundle,而是创建第二个从Hibernate Bundle中读取值的配置对象。