我对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
答案 0 :(得分:1)
好的,我发现了问题原因。它是在事务中更早查询的。 JOOK用于创建递归sql请求,并休眠以将该请求映射到实体。由于实体具有映射的继承关系,因此我必须在硬编码为0的请求中添加“ clazz_”字段,此请求之后,所有实体都会以某种方式缓存在第一个lvl休眠缓存中,然后无法从DB重新请求。 我添加到我的JOOK
.select(when(B.ID.isNotNull(), 1).otherwise(0).as("clazz_"))
现在一切都按预期运行