Hibernate, отображение внешних ключей, которые были сгенерированы последовательностью в родительской таблице - PullRequest
4 голосов
/ 23 сентября 2010

У меня есть отношение 1: n в базе данных и объекты java, которые представляют отношение с hibernate. Первичный ключ родительской таблицы генерируется с последовательностью базы данных, дочерний объект использует первичный ключ родительского объекта в качестве внешнего ключа.

Я создаю новый родительский объект, включая набор новых дочерних объектов. Затем я пытаюсь сохранить все объекты с один единственный

session.save(contract);

Хранение родительского объекта работает без проблем, но как только я добавляю дочерние объекты, я получаю исключение

... свойство not-null ссылается на нулевое или временное значение ...

из-за отсутствия FK в дочернем объекте.

Существует ли сопоставление, которое указывает hibernate использовать вновь сгенерированный PK родительского объекта в качестве FK в дочерних объектах, или мне нужно отдельно сохранять персистентные объекты с установленным вручную FK?

отображение родительского объекта: ...

@Id 
@Column(name="ID", unique=true, nullable=false, precision=22, scale=0)
@SequenceGenerator(name="sequence_seq", sequenceName="SEQ_CONTRACT")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence_seq")
public long getId() {
    return this.id;
}

...

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="contract")
    public Set<ContractSearchtags> getContractSearchtagses() {
        return this.contractSearchtagses;
    }

...

отображение дочернего объекта

...

@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="CONTRACT_ID", nullable=false)
    public Contract getContract() {
        return this.contract;
    }

...

1 Ответ

1 голос
/ 23 сентября 2010

Существует ли сопоставление, которое указывает hibernate использовать вновь сгенерированный PK родительского объекта в качестве FK в дочерних объектах, или мне нужно отдельно сохранять персистентные объекты с установленным вручную FK?

Для этого нет конкретного сопоставления. Тем не менее, я подозреваю, что вы неправильно устанавливаете «обе стороны ссылки» при построении двунаправленной ассоциации. Вам нужно сделать что-то вроде этого:

Contract contract = new Contract();
...
ContractSearchtags tag = new ContractSearchtags();
...
contract.getContractSearchtagses().add(tag);
tag.setContract(contract);

session.save(contract);

Разработчики обычно используют «методы управления ссылками» для правильной установки обеих сторон (в Contract):

public void addToContractSearchtagses(ContractSearchtags tag) {
    contractSearchtagses.add(tag);
    tag.setContract(this);
}

И тогда код становится:

Contract contract = new Contract();
...
ContractSearchtags tag = new ContractSearchtags();
...
contract.addToContractSearchtagses(tag);

session.save(contract);

Ресурсы

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