Hibernate Каскад PERSIST - PullRequest
       21

Hibernate Каскад PERSIST

7 голосов
/ 25 февраля 2012

У меня есть общий вопрос о Hibernate, с которым я борюсь.

У меня есть класс A и класс B, где B зависит от A

В моем коде, когда я вызываю em.persist (objOfTypeA) Я ожидаю, что вставка будет идти и вставлять в обе таблицы AAA и BBB.Если я вручную нажму A, получу идентификатор A и заполню его в списке для каждого объекта, а затем сохраню этот список, все работает.Но я ожидаю, что это произойдет магически от Hibernate.

Я что-то не так делаю?Или я просто слишком многого ожидаю от Hibernate?

Спасибо

@Entity
@Table(name = "AAA")
@Veto
public class A {

    @Id
    @GeneratedValue
    @Column(name = "Id")
    private Long id;


    @NotNull
    @Column(name = "Name")
    private Long name;

    ...

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
    private List<B> b;
...
}

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId")
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id", updatable = false, insertable = false)
    @ManyToOne(optional = false)
    private A a;
...     
}

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Я наконец-то решил это. Ни один из приведенных или найденных мной примеров не сказал мне, что именно не так, только после моих собственных экспериментов мне удалось прийти к такому выводу:

Вместо того, чтобы

@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
private List<B> b;

это не сработало (FK все еще принимал NULL)

Это сработало:

@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE})
@JoinColumn(name="AId")
@NotNull
private List<B> b;
1 голос
/ 25 февраля 2012

Измените отображение класса B, как показано ниже,

@Entity
@Table(name = "BBB")
@Veto
public class B {

    @Id
    @GeneratedValue
    @Column(name="Id")
    private Long id;

    @NotNull
    @Column(name="AId", updatable = false, insertable = false)
    private Long aId;

    @NotNull
    @Column(name = "Name")
    private Long name;

    @JoinColumn(name = "AId", referencedColumnName="Id")
    @ManyToOne(optional = false)
    private A a;
...     
}

Вы использовали атрибуты updatable = false, insertable = false в неправильном месте, и я исправил его.

Чтение здесь чтобы понять, как они работают.

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