Лучший способ сохранить сущности JPA в платформе Play - PullRequest
1 голос
/ 12 декабря 2011

Я новичок в JPA, не говоря уже о JPA в Play, поэтому мне интересно, как лучше всего сохранить мои объекты с отношением @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. Есть ли способ сделать это? И каким образом это лучший способ сделать это?

1 Ответ

3 голосов
/ 12 декабря 2011

Да, вы можете каскадно сохранить от JumpSession до UserJump, установив соответствующую опцию каскадирования:

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

Кроме того, я не думаю, что было бы хорошей идеей сделать отношения от UserJump до User двунаправленными. В случае JumpSession это нормально, поскольку UserJump s можно рассматривать как части JumpSession (например, они сохраняются вместе с JumpSession). Но в случае User это не имеет смысла, поэтому я рекомендую вам удалить поле userJumps из User. Когда вам нужно UserJump для конкретного User, вместо этого сделайте явный запрос.

Подробнее о последнем пункте. Я думаю, что число UserJump с на JumpSession, вероятно, будет ограничено, тогда как число UserJump с на User потенциально не ограничено. Это означает, что UserJump s из User должны отображаться с некоторой пагинацией, что делает поле userJumps бесполезным.

Итак, учитывая сложности, вызванные отношениями "многие-многие" ( Определение отношений ToMany) в моделях JPA , Проблемы производительности отображаемых в Hibernate сборок ) Думаю, было бы лучше вообще убрать это поле.

...