Один ко многим не обновляется без ссылки при установке только идентификатора вместо того, чтобы сначала взять объект из БД - PullRequest
0 голосов
/ 16 февраля 2019

Я использую Spring Hibernate с JPA.cascade = CascadeType.ALL и @Id @GeneratedValue (стратегии = GenerationType.IDENTITY).У меня есть две таблицы: одна - Пользователь, другая - фотографии, когда я хочу добавить новую фотографию. Мне нужно пойти и взять пользователя из базы данных, а затем установить его в качестве пользователя на фотографии с помощью photo.setUser (пользователь).Есть ли способ просто сделать User user = new User ();user.setId (1), а затем поместить его на фото с помощью photo.setUser () без полной ссылки. Я получаю отсоединенную сущность, которая сохраняется, когда я выполняю repo.save (photo), когда я устанавливаю только идентификатор.

Что я хочу сделать:

User user = new User();
user.setId(1);
photo.setUser(user);
repo.save(photo)

Там, где пользователь уже создан в базе данных и имеет несколько фотографий.

вместо:

User user = repo.findUserById(1);
photo.setUser(user);
repo.save(photo);

мои сущности:

@Entity
@Table(name = "users")
public class Photo implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @OneToMany(cascade = CascadeType.ALL,mappedBy = "user", fetch = FetchType.EAGER)
    private List<Photo> photos = new ArrayList<>();


@Entity
@Table(name = "photos")
public class Photo implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinColumn(name = "user_id")
    private User user;

1 Ответ

0 голосов
/ 16 февраля 2019

Используйте EntityManager.getReference(), чтобы получить объект пользователя.Преимущество этого по сравнению с EntityManager.find() в том, что он не будет вызывать дополнительный SQL для получения пользовательского объекта.

Пользовательский объект - это просто прокси-сервер с установленным только идентификатором.Просто убедитесь, что у вас нет доступа к его свойствам, кроме идентификатора, перед сохранением, и тогда не будет запущен дополнительный SQL для получения пользователя, который подходит для установки внешнего ключа для существующего объекта с известным идентификатором.

User  user = entityManager.getReference(1, User.class);
photo.setUser(user);
repo.save(photo)

Если вы используете хранилище данных Spring, эквивалентный метод - getOne(), который будет вызывать EntityManager.getReference()

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...