2

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

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

public class Customer{

    // instead of int userId
    private User user;

    // instead of int activityId
    private Activity act;


    // ...
}

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

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

我的第一个想法是在我的UserDAO

public void initUser(Customer customer);

在我的ActivityDAO

public void initActivity(Customer customer);

初始化变量customer

4

2 回答 2

1

活动记录路线

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

基本上,您创建了一个建议类实现称为“HasUser”和“HasActivity”的接口的方面。HasUser您的接口HasActivity将只定义吸气剂。然后,您将制作将在 和 的实际实现中编织的getUser()方面getActivity()

您的方面将完成实际的 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 必须制作传输对象,或者您可以附加延迟加载。

于 2012-06-14T14:24:26.930 回答
0

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

于 2012-06-14T13:42:24.490 回答