2010-12-06 104 views
0

我有了另一個人喜歡這些參考實體:如何當實體持續或更新,自動更新實體

class School { 
    private boolean used = false; 
} 

class Student { 
    @ManyToOne 
    private School school; 
} 

屬性used表明是是否使用School實體引用或不。所以創建時,School實體應該有used錯誤,但一旦Student引用它,used必須轉爲true。有沒有自動的方式來做到這一點像數據庫中的觸發器?

我嘗試在這樣Student實體使用@PrePersist@PostPersist,但它不工作:

@PrePersist 
public void prePersist(){ 
    school.setUsed(true); 
} 

感謝,

回答

2

我的想法是,學校也應該有一個反向的學生名單。即

class School { 
    private List<Student> students; 
} 

因此,當學校加載時,您可以輕鬆訪問學生列表。然後找出一所學校是否被使用變得非常簡單。你不再需要一個布爾標誌,只是這個:

public boolean hasStudents() { 
    return students.size() > 0; 
} 
+0

這是我的案例最簡單最聰明的解決方案,謝謝兄弟! – 2010-12-06 14:31:39

0

另外,你需要定義CascadeType的。 請參見下面的例子:

class Team { 
    @OneToMany(mappedBy="team", cascade = CascadeType.ALL) 
    Set players; 
} 
class Player { 
    @ManyToOne 
    Team team; 
} 
+0

感謝提醒,但這不是點這裏兄弟。只有當你堅持/更新/移除玩家時,它纔會持續/更新/移除團隊。 – 2010-12-06 04:49:21

1

一種方法是寫在插入的觸發器,學生表進行更新,如果有人拿着外鍵參考上學,你必須檢查所有將檢查學校在這裏。同樣將您使用的變量映射到School表中的一列。如果任何學生持有一個參考,而不是使該列成爲true並從您的應用程序層調用刷新。

關於第二個想法,檢查這是否可能。如果您需要使用變量的邏輯,請參閱如果您可以編寫HQL並使用該HQL檢查該特定學校目前是否正在被任何學生使用。我認爲這是一種更清潔的方法,但最後這是一個基於要求的呼叫:)