我是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对象。有没有办法做到这一点?哪种方式最好的方法呢?
答案 0 :(得分:3)
是的,您可以通过设置适当的级联选项,将保存从JumpSession
级联到UserJump
:
@OneToMany(mappedBy="jumpSession", cascade = CascadeType.PERSIST)
public List<UserJump> userJumps;
此外,我认为从UserJump
到User
双向建立关系并不是一个好主意。在JumpSession
的情况下,它很好,因为UserJump
可以被视为JumpSession
的一部分(例如,它们与JumpSession
一起保存)。但是在User
的情况下它没有意义,因此我建议您从userJumps
中删除User
字段。如果您需要针对特定UserJump
User
,请改为明确查询。
关于最后一点的更多内容。我认为UserJump
每个JumpSession
的数量可能有限,而UserJump
每个User
的数量可能无限制。这意味着UserJump
的{{1}}应该以某种分页方式显示,这使得User
字段无用。
因此,考虑到多对关系(Deterring “ToMany” Relationships in JPA models,Hibernate mapped collections performance problems )引入的复杂问题,我认为最好完全删除此字段。