2011-12-12 71 views
1

我是JPA的新手,更不用說JPA在Play中,所以我想知道什麼是最好的方式來保存與多個類的@ManyToOne關係的對象。在Play框架中堅持JPA實體的最佳方法

的UserJump類被定義爲如下:

@Entity 
public class UserJump extends Model{ 
    @ManyToOne 
    public User user; 
    @ManyToOne 
    public JumpSession jumpSession; 
    public String parachuteUID; 
    public String notes; 
    public int status; 

}

到UserJump的關係從內部JumpSession由下式定義:

@OneToMany(mappedBy="jumpSession") 
public List<UserJump> userJumps; 

同樣,在用戶類別:

@OneToMany(mappedBy="user") 
public List<UserJump> userJumps; 

這裏是我如何保存的東西現在:

JumpSession jumpSession = new JumpSession(); 
//...Code here to fill in jumpSession... 
jumpSession.save(); 

UserJump userJump; 
for(String jumperUID : jumpers) 
{ 
    userJump = new UserJump(); 
    userJump.jumpSession = jumpSession; 
    userJump.user = User.findById(jumperUID); 
    userJump.status = 1; 
    userJump.save(); 
} 

在我看來,應該有一種方法來拯救那些UserJump對象的列表,名爲userJumps然後做jumpSession.userJumps = userJumps,然後jumpSession.save()它應該堅持所有的UserJump對象。有沒有辦法做到這一點?哪種方式是最好的方法呢?

回答

3

是的,你可以級聯從JumpSession保存到UserJump通過設置適當的級聯選項:

@OneToMany(mappedBy="jumpSession", cascade = CascadeType.PERSIST) 
public List<UserJump> userJumps; 

另外,我不認爲這是一個好主意,使關係從UserJumpUser雙向的。在JumpSession的情況下沒有問題,因爲UserJump s可以作爲JumpSession的一部分處理(例如,它們會與JumpSession一起保存)。但是在User的情況下,它沒有任何意義,所以我建議您從User刪除userJumps字段。當您需要UserJump特定User時,請改爲顯式查詢。

更多關於最後一點。我認爲的UserJump s的數量可能是有限的,而 s的數量爲User可能是無限的。這意味着UserUserJump s應顯示某種分頁,這使得userJumps字段無用。

因此,考慮到由一對多關係引起的併發症(Deterring 「ToMany」 Relationships in JPA models,Hibernate mapped collections performance problems ),我認爲最好將這個字段完全刪除。

+0

嗯,它最初是User和JumpSession之間的'@ ManyToMany'關係,但我需要在連接表中有更多的列。用戶將不斷查看它們所屬的所有跳轉會話,並且該關係由UserJump(存儲有關跳轉的數據)維護。爲什麼雙方的關係不好?用戶與JumpSession具有同樣的UserJump關係。 – Indigenuity

+0

@Indigenuity:更新。 – axtavt

+0

非常感謝您花時間來解釋。所以,即使兩個實體之間存在一對多的關係,如果一個對另一個的比例是無界的,那麼它不應該如此映射?我猜這是一條通用規則,不是隻適用於此處的規則。 – Indigenuity