在具有 Inheritancetype.TABLE_PER_CLASS 的实体上使用 JPARepository 会导致错误的查询
Using JPARepository on Entity with Inheritancetype.TABLE_PER_CLASS result in wrong query
我在我的项目中使用继承类型 "TABLE_PER_CLASS" 定义了 2 个实体。
之后,我定义了 2 个存储库来访问数据,但是,当我使用它们查找 B 实体的记录时,生成的查询不包含 JOIN 语句,而只包含 "SELECT id, name, alternate_name from b" 并且它失败了,因为 "name"字段不存在。
我是不是错过了什么我看不到的东西?
实体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;
...
...
}
基础资料库:
@SuppressWarnings("unused")
@NoRepositoryBean
public interface BaseRepository<T extends A> extends JpaRepository<T, Long> {
}
A存储库:
@SuppressWarnings("unused")
@Repository
public interface ARepository extends BaseRepository<A> {
}
B存储库:
@SuppressWarnings("unused")
@Repository
public interface BRepository extends BaseRepository<B> {
}
我假设你有一个 table a 和一个 table b.
但是TABLE_PER_CLASS每个具体子类只会generate/use一个table。在你的情况下只是 table b.
如果你想要 table a 和 b 你必须使用 JOINED 策略。
尝试使用@GeneratedValue 注解而不明确说明策略。
@Id
@GeneratedValue
private Long id;
我在我的项目中使用继承类型 "TABLE_PER_CLASS" 定义了 2 个实体。 之后,我定义了 2 个存储库来访问数据,但是,当我使用它们查找 B 实体的记录时,生成的查询不包含 JOIN 语句,而只包含 "SELECT id, name, alternate_name from b" 并且它失败了,因为 "name"字段不存在。
我是不是错过了什么我看不到的东西?
实体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;
...
...
}
基础资料库:
@SuppressWarnings("unused")
@NoRepositoryBean
public interface BaseRepository<T extends A> extends JpaRepository<T, Long> {
}
A存储库:
@SuppressWarnings("unused")
@Repository
public interface ARepository extends BaseRepository<A> {
}
B存储库:
@SuppressWarnings("unused")
@Repository
public interface BRepository extends BaseRepository<B> {
}
我假设你有一个 table a 和一个 table b.
但是TABLE_PER_CLASS每个具体子类只会generate/use一个table。在你的情况下只是 table b.
如果你想要 table a 和 b 你必须使用 JOINED 策略。
尝试使用@GeneratedValue 注解而不明确说明策略。
@Id
@GeneratedValue
private Long id;