JPA对条件非常渴望

时间:2013-11-09 07:48:10

标签: java jpa annotations eclipselink fetch

技术:JPA,eclipseLink,postgreSQL。

我正在寻找解决问题的好方法:

我的datamodel包含一个Employee实体,它与实体Task具有OneToMany关系,具有startDate和endDate(以及更多属性)。 当我加载员工时,我总是需要这些任务,所以我将fetchtype设置为eager。 问题是,应用程序使用的时间越长,员工就会引用越来越多的任务,但大多数都是(过去)。

因此,为了防止应用程序性能受到影响,我正在寻找一种基于JPA注释的方法来定义fetchtype的条件,在这种情况下,我只想加载一个员工的任务,后面有一个endDate过了午夜。

我找到了一个带注释@PostLoad的解决方案(参见下面的代码),但我想知道是否有可能在该字段上使用注释执行相同的操作。

在您看来,最好的方法是什么?

感谢您的帮助!

@Entity
@Table(name = "tbl_employee")
public class Employee implements Serializable {

    //... (attributes)

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "employee")
    private List<Task> tasks;

    @PostLoad
    public void loadTasks() {
        tasks = new TaskDao().getTasksByEmployeeByToday(this);
    }

    //... (getters, setters)

}



@Entity
@Table(name = "tbl_task")
public class Task implements Serializable {

    //... (attributes)

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "fi_employee", referencedColumnName = "id_employee")
    private Employee employee;

    @Column(name = "start_date", nullable = true)
    private Timestamp startDate;

    @Column(name = "end_date", nullable = true)
    private Timestamp endDate;

    //... (getters, setters)
}


public class TaskDao extends GenericDaoCRUD<Task> {

    public List<Task> getTasksByEmployeeByDate(Employee employee, Timestamp date) {
        Timestamp lastMidnight = Utils.getLastMidnight(date);

        String statement = "SELECT t FROM Task t WHERE t.employee = :employee and t.endDate > :enddate";

        TypedQuery<Task> query = getEntityManager().createQuery(statement, Task.class);
        query.setParameter("employee", employee);
        query.setParameter("enddate", lastMidnight);

        try {
            return query.getResultList();
        } catch (NoResultException e) {
            LOG.info("No tasks found for employee=" + employee + "; and date>"
                    + lastMidnight);
        }
        return null;
    }

    public List<Task> getTasksByEmployeeByToday(Employee employee) {
        return getTasksByEmployeeByDate(employee, new Timestamp(System.currentTimeMillis()));
    }

1 个答案:

答案 0 :(得分:0)

我想采用另一个线程将历史数据移动到另一个表中以改善性能,而不是您的提议。

并添加另一个视图以联合主表和历史记录表,以防您正在为报告或某些内容检索某些数据。