Вопрос

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

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

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

Я делаю что-то неправильно?Или я просто ожидаю слишком многого от 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;
...     
}
Это было полезно?

Решение

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

вместо того, чтобы иметь

@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;
.

Другие советы

Изменить отображение класса 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 не в том месте и я это исправил.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top