如何最好地跨多个PU共享实体类/ DAO?

时间:2013-04-17 16:51:31

标签: java spring java-ee jpa architecture

让我们举一个基本的例子,比如我们有一个实体类

@Entity
public class User {
}

和处理数据的DAO:

public interface UserDao {
    @Transactional
    public void changeUser(User user);
}

@Repository
public class UserDaoImpl implements UserDao {
    @PersistenceContext
    private EntityManager em;

    @Override
    public void changeUser(User user) {
        // ...
    }
}

我们有一个主Maven项目,其中包含许多其他子项目,我们用它来构建多个应用程序(WAR,JAR等)。我们选择的框架是Spring。

每个应用程序都需要上面的实体/ DAO,并且不需要每个应用程序自定义,一切都保持不变。 每个应用程序都有自己的数据源/持久性单元/事务管理器。

如何在多个应用程序中最好地重用上述实体/ DAO?实体需要持久保存在应用程序的数据库中,我们还需要重用应用程序的事务管理器。

在类似情况下你做了什么?

2 个答案:

答案 0 :(得分:1)

我会创建包含实体和DAO的单独Maven模块(您甚至可以创建两个模块 - 一个用于实体,一个用于DAO)。

此模块将作为依赖项添加到需要DB层的任何其他应用程序模块(EJB或WAR模块)。在Spring配置中,您应该正确定义数据源,持久化上下文,事务管理器等的注入规则。这样,您将拥有不同配置的公共代码。

答案 1 :(得分:0)

我同意,模块化课程很容易;自动化配置查找/加载是棘手的部分。

我想可以为每个模块创建一个applicationContext.xml(在其中列出bean,控制器等)并使用多配置支持来加载它们。但是很明显,我们无法将所有XML文件命名为以下建议:

主要项目web.xml

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:auto-appctx-*.xml</param-value>
    </context-param>

一个Maven / Ant脚本,可以在打包每个模块/ JAR时为XML文件加上时间戳:

    <target name="copy-unique-appctx">
        <timestamp/>
        <copy src="src/resource/applicationContext.xml"
            dest="build/classes/auto-appctx-${timestamp}.xml"/>
    </target>

请注意,此Ant目标是“按内存”键入的,此刻是粗略的,需要更正(如果这个想法确实有效)。