【问题标题】:Initialize JPA-like entities with JDBC使用 JDBC 初始化类似 JPA 的实体
【发布时间】:2012-06-17 13:23:04
【问题描述】:

我正在为一个 Web 项目实现几个 DAO 类,由于某些原因我必须使用 JDBC。

现在我想返回一个这样的实体:

public class Customer{

    // instead of int userId
    private User user;

    // instead of int activityId
    private Activity act;


    // ...
}

使用 JPA useractivity 可以轻松加载(并自动指定实体之间的关系)。

但是,如何使用 JDBC?有没有一种通用的方法来实现这一目标?我应该在我的CustomerDAO 中加载everiting 吗?是否可以为引用的实体实现延迟初始化

我的第一个想法是在我的UserDAO 中实现:

public void initUser(Customer customer);

在我的ActivityDAO:

public void initActivity(Customer customer);

初始化customer中的变量。

【问题讨论】:

    标签: java jpa jdbc data-access-layer


    【解决方案1】:

    Active Record 路由

    您可以使用 AspectJ ITD 来做到这一点,并基本上将您的实体变成 Active Record 类似的对象。

    基本上,您创建了一个方面,它建议实现名为“HasUser”和“HasActivity”的接口的类。您的接口HasUserHasActivity 将只定义getter。 然后,您将在 getUser()getActivity() 的实际实现中编织 Aspects。

    您的方面将完成实际的 JDBC 工作。虽然 AspectJ 的学习曲线最初很陡峭,但它会让您的代码更加优雅。

    您可以在AspectJ ITD stackoverflow post 上查看我的一个答案。

    您还应该检查 springs @Configurable,它将自动将您的依赖项(例如您的数据源或 jdbc 模板)装入非托管 spring bean。

    当然,最好的例子是Spring Roo。只需查看它生成的 AspectJ 文件,就可以了解如何使用 @Configurable(确保使用 activerecord 注释)(假设 roo 使用 JPA)。

    DAO 路线

    如果你真的想走 DAO 路线而不是你需要这样做:

    public class Customer{
    
        // instead of int userId
        private Integer userId;
    
        // instead of int activityId
        private Integer activityId;
    
    }
    

    因为在 DAO 模式中,您的实体对象不应该具有行为。您的服务和/或 DAO 将必须制作传输对象,或者您可以附加延迟加载。

    【讨论】:

    • 返回一个带有userIduser 引用的实体是一种不好的做法吗? DAO 可以只初始化 id (user = null),然后当我真正需要它时,我可以加载 user 实例(例如使用一些 UserDAO 方法)......
    • 如果你这样做(我之前这样做也是为了保存传输对象)你应该将该字段标记为瞬态和另一个注释以防止用户实例被序列化。
    【解决方案2】:

    我不确定是否有任何自动化方法。如果没有 ORM,我通常将 getter 定义为单例,其中我的引用类型默认初始化为 null,即我的获取函数将加载原语 + 字符串并将它们保留为 null。一旦我需要getUser(),我的getter 会查看它是否为空,如果是,它会根据客户的ID 发出另一个选择语句。

    【讨论】:

    • 因此,如果尚未初始化,您只需使用另一个 dao (UserDAO) 通过 id 获取 user... 对吗?
    • 这是我对 DAO 模式的问题。当你做这样的事情时,它不再是 DAO。如果您真的想遵循将行为与状态分开的 DAO 模式,您需要让实体仅返回活动和用户的 Id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多