Я пытаюсь освоить Hibernate и Kotlin, поэтому я определил сущность следующим образом:
@Entity
class VolumeFlow(
// ...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "volumeFlow",
cascade = [CascadeType.ALL])
private var _volumesPerHour: MutableList<VolumePerHour> = ArrayList()
) {
var volumesPerHour: List<VolumePerHour>
get() = Collections.unmodifiableList(_volumesPerHour.toList())
set(value) {
_volumesPerHour.clear()
_volumesPerHour.addAll(value)
}
}
Здесь VolumePerHour
- очень простая сущность, использующая @ManyToOne
, Существует один конкретный c вариант использования, когда я хочу загружать их с нетерпением, и я определил средство доступа к репозиторию Spring Data, например:
@EntityGraph(attributePaths = "_volumesPerHour")
List<VolumeFlow> readAllByIdIn(Collection<Integer> ids);
Я полагаю, что это не Hibernate или Spring Data, указанные c , но это просто, как я создаю граф сущностей. Теперь, если вы посмотрите внимательно, аргумент attributePaths
равен _volumesPerHour
, включая подчеркивание. Неиспользование этого приводит к:
java.lang.IllegalArgumentException: Unable to locate Attribute with the the given name
[volumesPerHour] on this ManagedType [VolumeFlow]
Это немного уродливо, поскольку цель свойства publi c и частного поля заключалась в том, чтобы скрыть последнее. Есть ли способы конкретно указать JPA имя атрибута?