Хранилище JPA данных Spring возвращает сущность родительского класса - PullRequest
0 голосов
/ 03 декабря 2018

У меня странная проблема с пружинными данными и наследованием, у меня есть два класса:

@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 она существует стот же идентификатор на 100% уверен.Если в отладке я пишу

BRepository.getOne(a.getId());

, он возвращает экземпляр A, тот же экземпляр A, что и выше, из ARepository.

Как я могу заставить эту работу работать так, как мне нужно?Я думаю, что проблема в каком-то спящем управляемом кеше или чем-то подобном.Я также попытался изменить equals и hashcode, как в этом примере http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#identifiers-composite-associations но не повезло, проблема все еще существует.

Версия Hibernate: 5.0.12. Загрузочные зависимости окончательной версии Spring: 1.5.6.RELEASE

1 Ответ

0 голосов
/ 04 декабря 2018

Хорошо, я выяснил причину проблемы.Это был запрос ранее в транзакции.JOOK использовался для создания рекурсивного SQL-запроса, а Hibernate - для сопоставления этого запроса с сущностью.Из-за того, что сущность имеет наследование для отображения, я должен добавить поле «clazz_» в запрос с жестко закодированным 0, после этого запроса вся сущность каким-то образом была кэширована в первом кэше lvl hibernate и не может быть затем повторно запрошена из БД.Я добавляю в свой JOOK

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

И теперь все работает как положено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...