Hibernate инициализирует набор «один ко многим» со значением NULL, когда столбец без внешнего ключа, на который указывает ссылка, имеет значение NULL - PullRequest
0 голосов
/ 25 апреля 2020

У меня двунаправленное отношение «один ко многим» между EntityA и EntityB. Отношение не основано на внешнем ключе, вместо этого сущности должны быть связаны с уникальным linking_field в базе данных. Соответствующие отображения:

EntityA:

@Id
private Long id;

@OneToMany(mappedBy = "entityA")
private Set<EntityB> children = new HashSet<>();

@Column(name = "linking_field")
private String linkingField;

EntityB:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "entity_a_id", referencedColumnName = "linking_field", nullable = false)
private EntityA entityA;

Теперь давайте представим ситуацию, когда таблица EntityB пуста. Проблема заключается в том, что когда я пытаюсь получить entityA, значение которого null в столбце linking_field, с помощью метода репозитория Spring Data, который явно указывает поле JOIN FETCH es children, поле children инициализируется с помощью null , Однако, это не тот случай, когда установлен linking_field - тогда Hibernate назначает пустой PersistentSet для children, что является желательным для меня поведением. Можно ли это как-то преодолеть?

У EntityA есть linkingField == null:

EntityA entityA = entityARepository.findByIdWithChildren(entityAId);
entityA.getChildren(); // null

У EntityA есть linkingField != null:

EntityA entityA = entityARepository.findByIdWithChildren(entityAId);
entityA.getChildren(); // empty Set -> desirable

Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2020

Видимо, так работает Hibernate, к сожалению. Я отладил код, и это релевантный фрагмент из класса CollectionType Hibernate:

private Object resolveKey(Serializable key, SharedSessionContractImplementor session, Object owner, Boolean overridingEager) {
    // if (key==null) throw new AssertionFailure("owner identifier unknown when re-assembling
    // collection reference");
    return key == null ? null : // TODO: can this case really occur??
        getCollection( key, session, owner, overridingEager );
}

В моем случае параметр key имеет значение null, поэтому получается, что они просто перезаписывают всю коллекцию с нулем.

...