2013-11-09 177 views
1

技術:JPA,eclipseLink,postgreSQL。JPA渴望滿足條件

我正在尋找一個很好的方式來解決問題,我有:

我的數據模型包含一個僱員的實體,具有與實體的任務,具有的startDate和結束日期的一個一對多的關係(和一些更多的屬性)。 當我加載員工時,我總是也需要這些任務,所以我已經設置了fetchtype以使其渴望。 問題是,應用程序的使用時間越長,員工引用的任務越多,但大多數都是過去的(遠)。

因此,爲了防止應用程序的性能受到影響,我正在尋找基於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())); 
    } 
+0

至少JPA 2標準沒有這樣的註釋。你可能有更多的運氣提供商特定的註釋.Hibernate提供了很多。 – kostja

回答

0

而不是你的建議,我想採取另一個線程將歷史數據移動到另一個表,以提高性能。

並添加另一個視圖來聯合主表和歷史表,以防您爲某些報表或某些內容進行回溯。