【问题标题】:Best way to persist JPA entities in Play framework在 Play 框架中持久化 JPA 实体的最佳方式
【发布时间】:2012-01-18 15:02:14
【问题描述】:

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

【问题讨论】:

    标签: mysql hibernate jpa persistence playframework


    【解决方案1】:

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

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

    另外,我认为从UserJumpUser 双向建立关系不是一个好主意。在JumpSession 的情况下,这很好,因为UserJumps 可以被视为JumpSession 的一部分(例如,它们与JumpSession 一起保存)。但在User 的情况下,它没有意义,所以我建议你从User 中删除userJumps 字段。当您需要 UserJump 来获取特定的 User 时,请改为进行显式查询。

    关于最后一点的更多信息。我认为每个JumpSessionUserJumps 的数量可能是有限的,而每个UserUserJumps 的数量可能是无限的。这意味着UserUserJumps 应该以某种分页方式显示,这使得userJumps 字段无用。

    因此,考虑到多对多关系(Deterring “ToMany” Relationships in JPA modelsHibernate mapped collections performance problems )带来的复杂性,我认为完全删除该字段会更好。

    【讨论】:

    • 嗯,原来是@ManyToMany User 和 JumpSession 之间的关系,但我需要在连接表中有更多列。用户将不断查看他们所属的所有跳转会话,并且该关系由 UserJump(存储有关跳转的数据)维护。为什么双向关系会不好?用户与 UserJump 的关系与 JumpSession 的关系一样多。
    • 非常感谢您花时间解释。那么,即使两个实体之间存在一对多的关系,如果一个与另一个的比率是无限的,它不应该这样映射吗?我猜这是一般规则,并非仅适用于此。
    • @Indigenuity:基本上是的,尽管一些 OO 纯粹主义者可能不同意。关键是,如果映射关系对您的代码毫无用处,您可以省略它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多