Mik*_*icz 5 java spring design-patterns hibernate
所以这是我的难题.我正在编写一个需要处理旧版本应用程序的工具.我有应用程序的代码,但不能改变任何类.为了从我们的数据库中提取信息,我有一个由Hibernate填充的各种DTO.它使用我们的应用程序版本1.0的数据对象,巧妙地命名为DataObject.以下是DTO课程.
public class MyDTO {
private MyWrapperClass wrapper;
public MyDTO(DataObject data) {
wrapper = new MyWrapperClass(data);
}
}
Run Code Online (Sandbox Code Playgroud)
DTO通过Hibernate查询实例化,如下所示:
select new com.foo.bar.MyDTO(t1.data) from mytable t1
Run Code Online (Sandbox Code Playgroud)
Now, a little logic is needed on top of the data object, so I made a wrapper class for it. Note the DTO stores an instance of the wrapper class, not the original data object.
public class MyWrapperClass {
private DataObject data;
public MyWrapperClass(DataObject data) {
this.data = data;
}
public String doSomethingImportant() { ... version-specific logic ... }
}
Run Code Online (Sandbox Code Playgroud)
This works well until I need to work on version 2.0 of our application. Now DataObject in the two versions are very similar, but not the same. This resulted in different sub classes of MyWrapperClass, which implement their own version-specific doSomethingImportant(). Still doing okay. But how does myDTO instantiate the appropriate version-specific MyWrapperClass? Hibernate is in turn instantiating MyDTO, so it's not like I can @Autowire a dependency in Spring.
我很乐意重复使用MyDTO(和我的许多其他DTO)这两个版本的工具,而不必复制该类.不要重复自己,等等.我敢肯定,我错过了一个非常简单的模式,这对我们有所帮助.有什么建议?
我和我的同事尝试了很多选择。我们决定使用 Hibernate 的文档很少的 ResultTransformer 接口(真的,Hibernate,缺乏文档是可耻的)。尽管使用 Transformer 迫使我们在 MyDTO 构造函数中手动解析 Object[] 数组,但这是一个值得权衡的选择。
在ResultTransformer中,我们通过Spring注入了一个版本特定的WrapperFactory。我们更改了查询以允许 ResultTransformer 实例化 MyDTO,瞧!问题解决了。以下是我们修改后的查询和 DTO 类:
"select t1.data from mytable t1"
Run Code Online (Sandbox Code Playgroud)
public class MyDTO<T> {
private MyWrapperClass wrapper;
public MyDTO(Object[] fields, WrapperFactory<T> wrapperFactory) {
T data = (T) fields[0];
wrapper = wrapperFactory.newWrapper(data);
}
}
Run Code Online (Sandbox Code Playgroud)
根据我对纪尧姆的评论,拦截器没有按预期工作。大概是因为 MyDTO 不是一个持久类。
我们还尝试让 DTO 直接通过单例类访问 ApplicationContext,并从那里获取 WrapperFactory。虽然这有效,但可以预见的是,它会干扰我们的单元测试,因此我们放弃了该方法。
归档时间: |
|
查看次数: |
597 次 |
最近记录: |