Каскады гибернации: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом - PullRequest
1 голос
/ 27 января 2012
@Entity
@Table(name = "parent")
public final class Parent extends Base {

@OneToOne(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
private Person person;

и выполнение (среди прочего) этого:

Parent parent = new Parent();
Person person = new Person();
parent.setPerson(person);
session.save(parent);

Я получаю упомянутое исключение?

Нужно ли мне вручную вызывать session.save (person) раньше?мне нужно добавить аннотацию каскадного типа в определение класса потомков (где он ссылается на родительский)?

Или я пропустил что-то еще очевидное?

Я не хочу использовать CascadeType.ALL, как при удалении родителя, я хочу сохранить этого человека (ребенка).

Обе сущности / таблицы расширяют общую базовую таблицу:

@MappedSuperclass()
public abstract class Base {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    public Integer getId() {
    return id;
    }

Будет ли этот эффект каскадным типомтребуется?

1 Ответ

5 голосов
/ 27 января 2012

Вы не упомянули версию Hibernate, но она не изменилась с тех пор, как я начал ее использовать.

Как вы можете прочитать в справочнике Hibernate , чтобы получить Javaстандартное SAVE_UPDATE вам нужно {CascadeType.PERSIST, CascadeType.MERGE} в Hibernate.

EDIT: при просмотре обновленной информации то, что вы делаете сейчас, заставляет Hibernate рассматривать ее как двунаправленное сопоставление один к одному.В основном это означает, что для каждого объекта в любой из этих двух таблиц должен быть аналогом в другой таблице с тем же идентификатором.Следовательно, вы не можете удалить только один из них, вы потеряете целостность FK.

Если вы хотите, чтобы это было однонаправленное отображение, например, если вы хотите иметь возможность удалить человека, но оставить родителя -Вы должны указать FK, обычно через @JoinColumn, например @JoinColumn(name="PERSON_ID", unique=false, nullable=true, insertable=true, updatable=true)

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