在Play框架中保留JPA实体的最佳方法

时间:2011-12-12 16:20:49

标签: mysql hibernate jpa persistence playframework

我是JPA的新手,更不用说Play中的JPA了,所以我想知道将@ManyToOne关系保存到多个类的对象的最佳方法是什么。

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;

同样在User类中:

@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的List中,然后执行jumpSession.userJumps = userJumps,然后执行jumpSession.save(),它应该保留所有UserJump对象。有没有办法做到这一点?哪种方式最好的方法呢?

1 个答案:

答案 0 :(得分:3)

是的,您可以通过设置适当的级联选项,将保存从JumpSession级联到UserJump

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

此外,我认为从UserJumpUser双向建立关系并不是一个好主意。在JumpSession的情况下,它很好,因为UserJump可以被视为JumpSession的一部分(例如,它们与JumpSession一起保存)。但是在User的情况下它没有意义,因此我建议您从userJumps中删除User字段。如果您需要针对特定​​UserJump User,请改为明确查询。

关于最后一点的更多内容。我认为UserJump每个JumpSession的数量可能有限,而UserJump每个User的数量可能无限制。这意味着UserJump的{​​{1}}应该以某种分页方式显示,这使得User字段无用。

因此,考虑到多对关系(Deterring “ToMany” Relationships in JPA modelsHibernate mapped collections performance problems )引入的复杂问题,我认为最好完全删除此字段。