java - 使用 JDBC 初始化类 JPA 实体

标签 java jpa jdbc data-access-layer

我正在为一个 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中的变量。

最佳答案

Activity 记录路线

您可以使用 AspectJ ITD 执行此操作,并实质上使您的实体成为 Active Record像物体。

基本上,您创建了一个方面,为实现名为“HasUser”和“HasActivity”的接口(interface)的类提供建议。您的接口(interface) HasUserHasActivity 将只定义 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/

相关文章:

java - JPA @Version 溢出

java - 从结果集对象中检索元素

java - getConnection 是否总是打开一个新连接?

java - spring 3、hibernate、dbcp 和 derby 连接问题

java - Spring中PreparedStatementSetter可以用于Delete查询吗

java - Spring 数据 JPA : query ManyToMany

JPA Criteria API 加入

java - 在java中单个语句中执行多个查询

java - 如何使用Java在Android中生成每个项目具有不同背景颜色的微调器?

java - 使用评级类实现赞成/反对评级