我的系统通过Hibernate / JDBC连接到Oracle。我想使用抽象重构它以将其实现与Hibernate库分离。这是备份,有一天团队可以切换到另一个JPA实现,而无需将核心业务逻辑更改为适应新的JPA实现。这样做的建议是什么?
顺便说一句,我想从大师那里得到一些建议,将现有项目与外部开源罐分开是什么常见做法/策略?
答案 0 :(得分:4)
直接依赖标准和流行的开源库是可以的。你不应该认为这是一个问题。例如,我有一个很大的代码库,它取决于joda-time,google-guava等。现在,根据你的情况,以下是我的观点
从一个JPA实现转移到另一个实现的可能性非常小,因为当您熟悉特定实现时(是实现,因为您可能希望优化某些内容,或者您正在寻找某些功能)从标准的JPA api中遗漏了它需要一些时间,你真的不想花费同样的努力来学习其他实现(即使你想要,业务也不会让你; - ))。
Spring已经抽象了大多数常用的API,比如JPA,JMS等。所以我建议你看一下这个选项。
答案 1 :(得分:2)
您应program against interfaces减少依赖关系。您的服务类 - 包含业务逻辑的服务类 - 应该依赖于数据访问对象接口而不是特定的DAO实现。像这样:
public class ImAServiceBean {
private EntityDAO entityDAO;
private void someBusinessLogic(){
entityDAO.createInstance(...);
DAO界面是这样的:
public interface EntityDAO {
void createInstance (...);
void updateInstance(...);
现在你正在使用像EntityHibernateDaoImpl这样的东西,但如果你想把你的持久性框架更改为MyBatis,你可以构建一个EntityMyBatisDaoImpl(实现EntityDAO)并在你的Services类中使用该类而不做任何改动(asumming you'重新使用某种依赖注入)。如果您使用JPA,JDO或任何持久性技术,同样的事情:您的业务逻辑仅依赖于普通接口,并且该接口可以实现,但任何持久性技术,甚至是JDBC
答案 2 :(得分:1)
JPA已经是一个单独的API。如果你的团队使用JPA,那么你应该已经能够毫不费力地从休眠状态切换。