1

テクノロジー: JPA、eclipseLink、postgreSQL。

私が抱えている問題を解決するための良い方法を探しています:

私のデータモデルには、startDate と endDate (およびその他の属性) を持つエンティティ Task との OneToMany 関係を持つ Employee-entity が含まれています。従業員をロードするときは、常にタスクも必要になるため、fetchtype を熱心に設定しました。問題は、アプリケーションが長く使用されるほど、従業員が参照するタスクが増えますが、それらのほとんどは (遠い) 過去のものです。

したがって、アプリケーションのパフォーマンスが低下するのを防ぐために、fetchtype の条件を定義する JPA アノテーション ベースの方法を探しています。

注釈 @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()));
    }
4

1 に答える 1