Как каскадно сохранить простое совместное первичное сопоставление первичного ключа в Hibernate 3.6 - PullRequest
1 голос
/ 11 ноября 2010

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

public class Person {
    @Id
    @GeneratedValue
    @Column(name = "Id")
    private Long id;

    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
    private Name name;
}

public class Name {
    @Id
    @Column(name = "Id")
    private Long id;

    @OneToOne
    @PrimaryKeyJoinColumn(name = "Id")
    private Person person;

    @Column
    private String first;
    @Column
    private String last;
}

Person person = new Person();
person.setName(new Name("first", "last"));
session.save(person);

Мы смогли легко настроить эти 2 объекта. Но мы должны сначала сохранить человека, а затем сохранить имя в спящем режиме. Очень важно, что нам нужно только спасти человека.

1 Ответ

0 голосов
/ 11 ноября 2010

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

При сохранении основного объекта сгенерировано следующее исключение (адаптировано к приведенному выше примеру): org.hibernate.id.IdentifierGenerationException: идентификаторы для этого класса должны быть назначены вручную перед вызовом save (): com.my.Name.

Также, если я посмотрю на таблицы, сгенерированные моей конфигурацией, я увижу, что таблица Person имеет FK-имя, которое указывает на идентификатор таблицы Name. Вся цель использования общих первичных ключей состоит в том, чтобы избежать таких столбцов FK, как этот.

Таким образом, перемещение mappedBy на дополнительную таблицу не является решением.

...