Spring Data JPA存储库返回父类的实体

时间:2018-12-03 12:24:57

标签: java spring hibernate

我对spring数据和继承有一个奇怪的问题,我有两个类:

@Getter
@Setter
@Entity
@Table(name = "a")
@Inheritance(strategy = InheritanceType.JOINED)
public class A {

  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "a_id_gen")
  @SequenceGenerator(name = "a_id_gen", sequenceName = "a_id_seq", allocationSize = 50)
  @Column(name = "id")
  private Long id;
}

还有B级

@Getter
@Setter
@Entity
@Table(name = "b")
public class B extends A {

@ManyToOne
@JoinColumn(name = "subject")
private Subject subject;
}

我还有两个简单的接口,可以像这样扩展JpaRepo:

public interface ARepository extends JpaRepository<A, Long>
public interface BRepository extends JpaRepository<B, Long>

然后在@Transactional中的代码中,我像这样使用它:

A a = ARepository.findOne(someId);
if (some checks here) {
    B b = BRepository.findOne(a.getId());
}

这是B在这里为NULL的问题,但是在表b的DB中它以100%确定相同的ID存在。如果在调试中我写

BRepository.getOne(a.getId());

它从ARepository返回A的实例,与上面的实例A相同。

我该如何根据需要进行这项工作?我认为在某些休眠托管缓存中存在该问题。我还尝试像本示例http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite-associations中那样更改equals和hashcode,但是没有运气,问题仍然存在。

休眠版本为:5.0.12.Final Spring Boot依赖项:1.5.6.RELEASE

1 个答案:

答案 0 :(得分:1)

好的,我发现了问题原因。它是在事务中更早查询的。 JOOK用于创建递归sql请求,并休眠以将该请求映射到实体。由于实体具有映射的继承关系,因此我必须在硬编码为0的请求中添加“ clazz_”字段,此请求之后,所有实体都会以某种方式缓存在第一个lvl休眠缓存中,然后无法从DB重新请求。 我添加到我的JOOK

.select(when(B.ID.isNotNull(), 1).otherwise(0).as("clazz_"))

现在一切都按预期运行