在具有Inheritancetype.TABLE_PER_CLASS的实体上使用JPARepository会导致错误的查询

时间:2018-08-23 11:43:15

标签: spring inheritance spring-data-jpa table-per-class

我在我的项目中使用继承类型“ TABLE_PER_CLASS”定义了2个实体。 之后,我定义了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> {

}

一个存储库:

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

}

B存储库:

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

}

2 个答案:

答案 0 :(得分:0)

我假设您有一个表a和一个表b。

但是TABLE_PER_CLASS将仅针对每个具体子类生成/使用一个表。就您而言,只是表b。

如果要使用表a和b,则必须使用JOINED策略。

答案 1 :(得分:0)

尝试使用@GeneratedValue批注,而无需明确说明该策略。

Reset