JPA AttributeOverride для встраиваемого класса с полями типа сущности - PullRequest
1 голос
/ 07 мая 2020

У меня есть встраиваемый класс с двумя полями. Одно из них - перечисление, а другое поле относится к типу класса сущности.

@Embeddable
public class EmbeddableClass {
    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="myField", insertable = false, updatable = false)
    private EntityClass myField;

    @Enumerated(EnumType.STRING)
    @Column(name="enumValue", insertable=false, updatable=false)
    private EnumClass enumValue;

    protected EmbeddableClass() {}

    public EmbeddableClass(EntityClass myField, EnumClass enumValue) {
        this.myField = myField;
        this.enumValue = enumValue;
    }
}

Я пытаюсь встроить объекты этого класса в другой класс. Два поля будут этого типа, поэтому я должен использовать @AttributeOverrides

@Entity
public class MyClass {
    @Column(name = "column_one")
    @AttributeOverrides({
            @AttributeOverride(name="enumValue", column= @Column(name="column_one_enum_value")),
            @AttributeOverride(name="myField", column= @Column(name="column_one_my_field"))
    })
    @Embedded
    private EmbeddableClass embeddableClass1;

    @Column(name = "column_two")
    @AttributeOverrides({
            @AttributeOverride(name="enumValue", column= @Column(name="column_two_enum_value")),
            @AttributeOverride(name="myField", column= @Column(name="column_two_my_field"))
    })
    @Embedded
    private EmbeddableClass embeddableClass2;

    // ...
}

В базе данных, я ожидаю, что таблица MyClass будет иметь 4 столбца, названные в честь вторых аргументов @AttributeOverride аннотации. Но это не то, что я получаю.

Два столбца для перечислений верны. Но для полей класса сущности я не получаю двух отдельных столбцов. Я получаю только один столбец на основе имени типа: entity_class. И когда я сохраняю объекты MyClass в базе данных, столбец entity_class остается пустым, даже несмотря на то, что сохраняемые мной объекты имеют значение myField.

Есть ли у меня способ достичь 4 столбца, которые я описал выше, сохранив класс Embeddable?

1 Ответ

0 голосов
/ 08 мая 2020

Вам не нужно использовать аннотацию @Column для @Embedded объектов, которые должны быть заменены в объекте MyClass двумя столбцами каждый.

update Я дважды проверил с документация и, похоже, необходимы следующие обновления:

  1. Добавьте referencedColumnName = "id", чтобы присоединиться к определению столбца в EmbeddableClass
@Embeddable
public class EmbeddableClass {
    @OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="myField", referencedColumnName = "id", insertable = false, updatable = false)
    private EntityClass myField;

    @Enumerated(EnumType.STRING)
    @Column(name="enumValue", insertable=false, updatable=false)
    private EnumClass enumValue;

    protected EmbeddableClass() {}

    public EmbeddableClass(EntityClass myField, EnumClass enumValue) {
        this.myField = myField;
        this.enumValue = enumValue;
    }
}
Обновление атрибута name в @ AssociationOverride / @ AttributeOverride со ссылкой на имя экземпляра embeddableClass1 / embeddableClass2:
@AssociationOverrides({
    @AssociationOverride(name="embeddableClass1.myField", joinColumns = @JoinColumn(name="column_one_my_field")),
    @AssociationOverride(name="embeddableClass2.myField", joinColumns = @JoinColumn(name="column_two_my_field"))
})
@AttributeOverrides({
    @AttributeOverride(name="embeddableClass1.enumValue", column= @Column(name="column_one_enum_value")),
    @AttributeOverride(name="embeddableClass2.enumValue", column= @Column(name="column_two_enum_value"))
})
@Entity
public class MyClass {
    @Embedded
    private EmbeddableClass embeddableClass1;

    @Embedded
    private EmbeddableClass embeddableClass2;

    // ...
}
(Необязательно) Если вам нужны сопоставления в EntityClass, вы можете добавить их, как описано здесь :
@Entity
public class EntityClass {
    @Id
    private int id;

    @OneToOne(mappedBy = "embeddableClass1.myField")
    private MyClass myClass1;

    @OneToOne(mappedBy = "embeddableClass2.myField")
    private MyClass myClass2;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...