2016-03-08 9 views
2

Нет ли способа сделать «одну» стороной владельца отношения «один ко многим»? Каждый отдельный образец имеет mappedBy в @OneToMany. Даже ответ this similar question имеет это.Двунаправленный односторонний с одним лицом, владеющим стороной

Я хочу, чтобы одна сторона была стороной-обладателем, потому что, когда я добавляю много/ребенка, я также изменяю некоторую информацию о одном/родительском, и я хочу просто обновить родителя, простоту кода и обеспечить, чтобы все это происходит в той же транзакции ACID.

Но я просто не могу заставить его работать. Hibernate жалуется на

Повторного столбец отображения для объекта

Моих объектов:

public class Parent { 

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

    @OneToMany(fetch = EAGER, cascade = {ALL}, orphanRemoval = true) 
    @JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false) 
    private final Set<Child> children = new HashSet<>(); 

} 

public class Child { 

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

    @ManyToOne 
    private Parent parent; 

} 

ответ

1

Для решения Повторного столбца в отображении на ошибку объекта.

Вы можете удалить nullable=false из @JoinColumn аннотацию, как показано ниже:

Вместо

@JoinColumn(name = "parent_id", referencedColumnName = "id", nullable = false) 

попробовать с

@JoinColumn(name = "parent_id", referencedColumnName = "id", insertable = false, updatable = false) 

Но если вы хотите сохранить nullable=false, то

либо удалить private Parent parent; декларацию от Child класса

или

сделать это при переходных процессах либо с помощью @Transient аннотацию или private transient Parent parent;

+0

Вы частично правы. Мне пришлось заменить 'nullable = false' на' insertable = false, updatable = false' – user384729

+0

@ user384729 Это хороший момент. Включая 'insertable = false, updatable = false', он не запускает дополнительные запросы обновления. –

0

Что вы имеете

@JoinColumn(name = "parent_id", referencedColumnName = "id") 

ничем не отличается от

@OneToMany(mappedBy="parent", fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true) 

на первый взгляд. Какова ваша мотивация для этого?

EDIT: Да, хорошо. Существует разница в том, как вы сохраняетесь с двунаправленными отношениями. Вы должны установить родительский элемент, если используете mappedBy, и вам не нужно устанавливать родителя, если вы используете @JoinColumn, но только если вы удалите , insertable = false, updatable = false`, поэтому я не уверен, почему было обсуждение необходимости включать их. Кроме того, я не уверен, почему вы повторяете повторяющуюся ошибку столбца в спящем режиме, я не получил ничего подобного. Следует отметить, что CascadeType.ALL необходим для сохранения ребенка без необходимости установки родителя.

+0

Это очень тревожно, я надеюсь, что это недоразумение; иначе я ошибаюсь. Я думаю, что то, что у меня есть (ваш первый фрагмент кода), делает мою родительскую сторону отношениями. Таким образом, мне не нужно вручную сохранять новый «Ребенок». Я могу просто добавить его к родительскому и обновить родителя. С вашим вторым фрагментом, 'Child' будет принадлежать стороне. Мне нужно будет выполнить 'child.setParent (parent)' и сохранить его вручную, childDao.save (child) '. – user384729