Entity Mapping с Cascade, похоже, не работает - PullRequest
0 голосов
/ 26 августа 2018

У меня следующая ситуация:

OrganisationEntity.java

@Entity
@Table(name = "organisation")
public class OrganisationEntity {
    // ...
    private PersonEntity contactPerson;
    // ...    
    @OneToOne
    @JoinColumn(name = "contact_person_id", referencedColumnName = "id", nullable = false)
    public PersonEntity getContactPerson() {
        return contactPerson;
    }

    public void setContactPerson(PersonEntity contactPerson) {
        this.contactPerson = contactPerson;
    }
    // ...
}

ContactPerson.java

@Entity
@Table(name = "person")
public class PersonEntity {
    private int id;
    // ...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    // ...
}

В базе данных таблицы Organisation имеется необнуляемый внешний ключ Person.Отображение сущностей является однонаправленным. Новое, когда я хочу сохранить новую пару записей (одна организация и один человек) с merge на OrganisationEntity. Я получаю следующую ошибку:

17: 10: 19.827 ПРЕДУПРЕЖДЕНИЕ [http-nio-8080-exec-2] [org.hibernate.action.internal.UnresolvedEntityInsertActions] [144] HHH000437: Попытка сохранить одну или несколько сущностей, которые имеют ненулевую связь с несохраненным переходным процессомюридическое лицо.Несохраненный переходный объект должен быть сохранен в операции до сохранения этих зависимых объектов.

Несохраненный переходный объект: ([ch.freiwilligenarbeit_sempach.entity.PersonEntity # 0])

Зависимые объекты: ([[ch.freiwilligenarbeit_sempach.entity.OrganisationEntity #]])

Необнуляемые ассоциации: ([ch.freiwilligenarbeit_sempach.entity.OrganisationEntity.contactPerson])

1026имеет смысл для меня, так как он пытается вставить организацию без ссылки на человека вообще.Поэтому я обычно определяю каскадное поведение, чтобы спящий режим сначала вставлял человека, устанавливал ссылку на организацию, а затем сохранял организацию.Я попробовал следующее на организационном объекте:
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contact_person_id", referencedColumnName = "id", nullable = false)
public PersonEntity getContactPerson() {
    return contactPerson;
}

и

@OneToOne
@JoinColumn(name = "contact_person_id", referencedColumnName = "id", nullable = false)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public PersonEntity getContactPerson() {
    return contactPerson;
}

Но ни один из них, похоже, не работает.Я все еще получаю ту же ошибку.Но я думаю, что это на самом деле должно работать.

Любая помощь высоко ценится!Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Это помогло.

@Cascade(org.hibernate.annotations.CascadeType.ALL)

Хотя я считаю, что я остановил tomcat и очистил заново развернутое веб-приложение, которое я вчера не работал.Сегодня это сработало так, как ожидалось, поэтому объекты, на которые делается ссылка (Person), были вставлены перед объектом, на который делается ссылка (Organization).

0 голосов
/ 26 августа 2018

Я не совсем понимаю, что вы хотите, но я полагаю, что вы хотите сохранить личность в виде организации человека.Если вы используете разные идентификаторы, вы должны добавить аннотацию @OneToOne с атрибутом mappedBy=contactPerson

в классе PersonEntity

@OneToOne(cascade = CascadeType.ALL, mappedBy = "contactPerson")
private OrganisationEntity orgEntity;

в классе OrganisationEntity

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contact_person_id", nullable = false)
private PersonEntity contactPerson; // name which is pointed as mappedBy attribute

Затем вы можете сохранить это правильное написание что-то вроде этого

orgEntity.setContactPerson(contactPerson);
orgRepo.save(orgEntity);

ps Я написал, используя инъекцию поля, но это не обязательно.

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