如何在没有xml的Dropwizard Hibernate Bundle类上设置NamingStrategy



我正在处理一个项目,该项目使用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中读取值的配置对象。

最新更新