Использование JPARepository для Entity с Inheritancetype.TABLE_PER_CLASS приведет к неверному запросу

Я определил 2 объекта в своем проекте, используя тип наследования "TABLE_PER_CLASS". После этого я определил 2 репозитория для доступа к данным, но когда я использую их для поиска записей для сущности B, сгенерированный запрос не включает в себя оператор JOIN, а только "SELECT id, name, alternate_name from b", и происходит сбой, потому что Поле "имя" не существует.

Я что-то упустил, чего не вижу?

Сущность A:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "a")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public abstract class A implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "name")
    private String name;

    ...
    ...
}

Сущность B:

@Entity
@Table(name = "b")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class B extends A implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "alternate_name")
    private String alternateName;

    ...
    ...
}

BaseRepository:

@SuppressWarnings("unused")
@NoRepositoryBean
public interface BaseRepository<T extends A> extends JpaRepository<T, Long> {

}

ARepository:

@SuppressWarnings("unused")
@Repository
public interface ARepository extends BaseRepository<A> {

}

BRepository:

@SuppressWarnings("unused")
@Repository
public interface BRepository extends BaseRepository<B> {

}

1 ответ

Решение

Я предполагаю, что у вас есть таблица a и таблица b.

Но TABLE_PER_CLASS будет генерировать / использовать таблицу только для конкретного подкласса. В вашем случае просто таблица б.

Если вы хотите таблицу a и b, вы должны использовать стратегию JOINED.

Попробуйте использовать аннотацию @GeneratedValue, не указывая явно стратегию.

@Id
@GeneratedValue
private Long id;
Другие вопросы по тегам