在其他Web应用程序中重用DAO

时间:2012-06-03 12:51:57

标签: java spring jpa spring-mvc persistence

我使用Spring MVC对网站进行编码,现在我想对其后端(即仪表板或CMS)进行编码,以便管理员对其进行管理。

由于我为前端编写了所有DAO,我想将它们重新用于后端(因为DB表显然是相同的,前端和后端共享相同的持久化上下文)。

我的想法是将后端编码为新的Web应用程序,其中DAO和域对象作为jar文件从前端导出并导入后端项目。持久性由JPA和Hibernate管理,每个DAO类都如下所示:

@Repository
public class UserDao {
    private EntityManager em;

    // ... Methods...

    @PersistenceContext
    void setEntityManager(EntityManager entityManager) {
        this.em = entityManager;
    }
}

后端网站的持久性配置(即JPA + Hibernate + MySQL)与前端的持久性配置完全相同。我期待这个配置被注入到JAR文件中导入的DAO中,但这显然不会发生。每当我尝试使用任何DAO中的任何方法时,我都会得到类似于以下的异常:

  

org.hibernate.hql.ast.QuerySyntaxException:UserJpa未映射[SELECT u FROM UserJpa u WHERE u.alias =:alias AND u.closed = false]

有解决方案可以解决这个问题吗?或者是否有更好的方法来实现我想要实现的目标(即使用相同的前端DAO对后端进行编码)?

非常感谢!

4 个答案:

答案 0 :(得分:3)

我想知道为什么你不能将两个UI部署为单个应用程序,并为用户和管理员提供基于角色的访问。由于您已经在使用Spring,因此Spring Security将成为限制按角色访问管理页面的自然选择。为什么重写后端?

答案 1 :(得分:0)

你也需要导出实体类,因为hibernate需要加载所有实体来处理数据库或者排除新配置文件中的实体

关于Spring Security我建议使用唯一的登录页面,但不同的主页,我认为你可以通过rol设置不同的主页

答案 2 :(得分:0)

  

UserJpa未映射[SELECT u FROM UserJpa u WHERE u.alias =:alias AND u.closed = false]

听起来你只是忘记在第二个应用程序中包含第一个应用程序的映射配置。确保第二个应用程序中的JPA运行时具有关于UserJpa类的所有相同配置。

答案 3 :(得分:0)

您是使用Hibernate注释还是XML配置进行OR映射?在前一种情况下,Hibernate SessionFactory上的packagesToScan属性没有看到UserJpa类,可能是因为您没有加载您认为正在加载的JAR。在后一种情况下,您缺少hibernate.cfg.xml或其等效项的导入。