Типы каскадов: ALL, MERGE и т. Д. - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть объект person и компьютерный объект, этот объект персонажа имеет поле с именем компьютера, один человек может иметь один компьютер, отношение один к одному.

class Person{

    @OneToOne(cascade=CascadeType.ALL)//in which situations this is true?  
    @JoinColumn(name = "computer_id",nullable=false) 
    private Computer computer;

    getComputer(){...}
    setComputer(Computer c){...}

    @Id
    private String id;
}

class Computer{

    @Id
    private String id;

}

Позвольте мне предположить, что у меня есть компьютерный объект в БД, и я получаю его методом загрузки.

Computer computer=entityManager.loadById({an id});
Person p=new Person();
p.setComputer(computer);

Теперь, если я хочу сохранить компьютер и человека, что мне делать?

entityManager.persist(p);

Я не могу сгенерировать ту же ошибку, но некоторое время назад я получил ошибку «отсоединенный объект передан для сохранения».

Каков наиболее подходящий способ сохранить все в БД без повторов?

Также вы можете посоветовать ресурсу (может быть, книгу), чтобы понять, что делать в разных ситуациях.

1 Ответ

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

Вам не нужен каскад в случае, который вы описываете, и достаточно настойчивого пользователя:

  • , поскольку компьютер был загружен с помощью EM, он подключен к EM.Любые изменения, сделанные на компьютере, будут автоматически сохранены в базе данных без каких-либо необходимых операций.
  • пользователь является новым объектом, который еще не является постоянным.Чтобы сделать это постоянным, вы должны позвонить persist.После этого вызова он будет присоединен к EM, и любое изменение, сделанное для пользователя, также будет автоматически сохранено в базе данных без каких-либо необходимых операций.

Ошибка «отсоединенный объект передан для сохранения» можетпроизойдет, если вы создали новый компьютер, затем нового пользователя, установите компьютер для пользователя и сохраните пользователя.В этом случае EM жалуется, потому что вы пытаетесь сделать постоянную сущность en (пользователь), которая ссылается на другую сущность (компьютер), которая не является постоянной.Существует два решения:

  • сделать компьютер постоянным, прежде чем сделать пользователя постоянным, путем вызова persist с компьютером
  • аннотировать ассоциацию person.computer cascade = PERSIST или cascade= ВСЕ, так что компьютер автоматически становится постоянным, когда пользователь становится постоянным.Обратите внимание, что ALL также включает в себя REMOVE.Поэтому, если вы удалите пользователя, его компьютер также будет удален.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...