我正在为一个 Web 项目实现几个 DAO 类,由于某些原因我必须使用 JDBC。
现在我想返回这样一个实体:
public class Customer{
// instead of int userId
private User user;
// instead of int activityId
private Activity act;
// ...
}
使用 JPA user
和 activity
可以轻松加载(并自动指定实体之间的关系)。
但是如何使用 JDBC?有没有一种通用的方法来实现这一目标?我应该在我的 CustomerDAO
中加载 everiting 吗?是否可以为引用的实体实现惰性初始化?
我的第一个想法是在我的 UserDAO
中实现:
public void initUser(Customer customer);
在我的 ActivityDAO
中:
public void initActivity(Customer customer);
初始化customer
中的变量。
最佳答案
Activity 记录路线
您可以使用 AspectJ ITD 执行此操作,并实质上使您的实体成为 Active Record像物体。
基本上,您创建了一个方面,为实现名为“HasUser”和“HasActivity”的接口(interface)的类提供建议。您的接口(interface) HasUser
和 HasActivity
将只定义 getter。
然后,您将制作将编织在 getUser()
和 getActivity()
的实际实现中的方面。
您的切面将完成实际的 JDBC 工作。尽管 AspectJ 的学习曲线最初很陡峭,但它会使您的代码更加优雅。
你可以看看我在 AspectJ ITD stackoverflow post 上的一个回答。 .
您还应该查看 springs @Configurable
,它会自动将您的依赖项(例如您的数据源或 jdbc 模板)装配到非托管 spring bean 中。
当然,最好的例子是Spring Roo。 .只需查看它生成的 AspectJ 文件即可了解(假设 roo 使用 JPA)您将如何使用 @Configurable(确保使用 activerecord 注释)。
DAO 路线
如果你真的想走 DAO 路线而不是你需要这样做:
public class Customer{
// instead of int userId
private Integer userId;
// instead of int activityId
private Integer activityId;
}
因为在 DAO 模式中,您的实体对象不应该有行为。您的服务和/或 DAO 必须制作传输对象,或者您可以附加延迟加载。
关于java - 使用 JDBC 初始化类 JPA 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11034309/