Hibernate - наследование одной таблицы один-к-одному

У меня есть 3 объекта BaseFoo, FooAbc, FooAbcDetail. FooAbc расширяет базовую сущность BaseFoo. Я пытаюсь установить взаимно однозначную связь между FooAbc и FooAbcDetail.

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "foo")
@Audited
@AuditOverride(forClass = Auditable.class)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type_id", discriminatorType = DiscriminatorType.INTEGER)
public abstract class BaseFoo extends Auditable implements Serializable {

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

    //other fields
}

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Audited
@AuditOverride(forClass = BaseFoo.class)
@DiscriminatorValue("2")
public class FooAbc extends BaseFoo implements Serializable {

    @EqualsAndHashCode.Exclude
    @ToString.Exclude
    @NotAudited
    @OneToOne(mappedBy = "fooAbc",
              fetch = FetchType.LAZY,
              cascade = CascadeType.ALL,
              orphanRemoval = true,
              optional = false)
    private FooAbcDetail fooAbcDetail;

    //other fields
}

@Data
@Entity
@Table(name = "foo_abc_detail")
public class FooAbcDetail implements Serializable {

    @Id
    @Column(name = "foo_id"/* foo_abc_id (I tried both) */)
    private Long id;

    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    @MapsId //also tried @MapsId("id")
    @OneToOne(fetch = FetchType.LAZY)
    private FooAbc fooAbc; //also tried BaseFoo

    //other fields
}

При запуске проекта Hibernate выдает:

org.hibernate.MappingException: невозможно найти столбец с логическим именем: id в org.hibernate.mapping.Table (public.foo_abc_detail) и связанных с ним супертаблицах и вторичных таблицах

В чем проблема?

Среда

  • Гибернация 5.3.10.Финал
  • Spring Boot 2.1.7.RELEASE

person mnesimi    schedule 22.08.2019    source источник
comment
Покажите, как вы настраиваете foo_abc_detail стол   -  person XtremeBaumer    schedule 22.08.2019
comment
@XtremeBaumer извините, я не могу понять. Что вы имеете в виду под настройкой? Это DDL?   -  person mnesimi    schedule 22.08.2019
comment
Именно это нам и нужно   -  person XtremeBaumer    schedule 22.08.2019
comment
@XtremeBaumer Извините, я опоздал. Вот. CREATE TABLE foo_abc_detail ( foo_id bigint NOT NULL CONSTRAINT pk_foo_abc_detail PRIMARY KEY CONSTRAINT "fk_AwfsRYAAxLwavrnv16Re" REFERENCES foo ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE --other columns );   -  person mnesimi    schedule 22.08.2019


Ответы (2)


Эта ошибка сообщает вам, что в foo_abc_detail таблице нет столбца с именем foo_id. Столбец в foo_abc_detail просто называется id.

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "foo")
@Audited
@AuditOverride(forClass = Auditable.class)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type_id", discriminatorType = DiscriminatorType.INTEGER)
public abstract class BaseFoo extends Auditable implements Serializable {

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

    //other fields
}

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Audited
@AuditOverride(forClass = BaseFoo.class)
@DiscriminatorValue("2")
public class FooAbc extends BaseFoo implements Serializable {

    @EqualsAndHashCode.Exclude
    @ToString.Exclude
    @NotAudited
    @OneToOne(mappedBy = "fooAbc",
              fetch = FetchType.LAZY,
              cascade = CascadeType.ALL,
              orphanRemoval = true,
              optional = false)
    private FooAbcDetail fooAbcDetail;

    //other fields
}

@Data
@Entity
@Table(name = "foo_abc_detail")
public class FooAbcDetail implements Serializable {

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

    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    @MapsId //also tried @MapsId("id")
    @OneToOne(fetch = FetchType.LAZY)
    private FooAbc fooAbc; //also tried BaseFoo

    //other fields
}
person GokulRaj K.N.    schedule 22.08.2019
comment
Предоставьте структуру столбцов таблицы foo_abc_detail - person GokulRaj K.N.; 22.08.2019

Окей, я решил. Я не знаю, лучший ли это способ сделать это, но он работает! Я заменил аннотацию @MapsId на @JoinColumn. Окончательный результат класса FooAbcDetail, как показано ниже.

@Data
@Entity
@Table(name = "foo_abc_detail")
public class FooAbcDetail implements Serializable {

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

    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id", referencedColumnName = "id", nullable = false)
    private FooAbc fooAbc;

}
person mnesimi    schedule 22.08.2019