Hibernate mapping saving issue

311
03 августа 2017, 23:44

У меня есть две проблемных сущности: Первая:

public class User implements UserDetails {
    private static final long serialVersionUID = -8442780593066407492L;
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "user_role",
            joinColumns = {@JoinColumn(name = "user_id")},
            inverseJoinColumns = {@JoinColumn(name = "role_id")})
    private Set<UserRole> userRoles = new HashSet<UserRole>();
    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private Set<CommentReserv> comments = new HashSet<CommentReserv>();
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<SimpleGrantedAuthority> result = new 
        ArrayList<SimpleGrantedAuthority>();
        for (UserRole userRole: userRoles) {
            result.add(new 
            SimpleGrantedAuthority(userRole.getListRole().name()));
            }
        return result;
    }
...
}

Вторая:

public class CommentReserv implements Serializable {
    private static final long serialVersionUID = 1579363480188238317L;
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @ManyToOne
    @JoinColumn(name = "reservation_id")
    private Reservation reservation;
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private User user;
...
}

В контроллере я получаю данные из БД:

Reservation reservation = this.reservationRepository.getReservationById(params.get("reservationId").toString());            
User currentUser = this.userRepository.getUser(principal.getName());

До данного момента все нормально. User.getId() возвращает 0 (у меня единственная записть в БД). Далее:

commentReserv.setReservation(reservation);
commentReserv.setComment(params.get("comment").toString());
commentReserv.setUser(currentUser);

После этого я сохраняю полученное в БД(.save(comment)). При этом в БД создается копия!!! User с новым id и его id ставится в соответствующее поле сохраненного CommentReserv. Кроме этого, все остальное сохраняется корректно и ошибок не возникает. Помогите разгадать загадку.

Upd:Если убрать cascade из CommentReserv, то возникает "TransientObjectException: object references an unsaved transient instance - save the transient instance beforeQuery flushing: com...domain.User]"

Answer 1

Проблема оказалась в том, что Hibernate воспринимает сущность с id=0 как не существующую в базе и добавлял новую, а в моей БД хранился всего один пользователь у которого id как раз был 0. Я поменял в БД id этого пользователя на 1 и все заработало. Спасибо @MrFylypenko за правильный совет.

READ ALSO
Ошибка getRunningServices is deprecated API 26

Ошибка getRunningServices is deprecated API 26

При написани данного кода:

659
LibGDX + JavaFX

LibGDX + JavaFX

Есть у меня идея фикс, сделать редактор(ы) используя базовый интерфейс JavaЯ пробовал 2 варианта этой реализации, но пока не преуспел

315
Java Apache POI (стили текста/свойства ячеек)

Java Apache POI (стили текста/свойства ячеек)

Есть небольшой код на экспорт данных с Jtable в excel

419
Собрать HashMap в JSP

Собрать HashMap в JSP

Дано: Создается система прохождения различных тестов , для обработки данных было выбрано решение собирать в jsp HashMap состоящий из ключа (ID ответа)...

381