В последнее время мой проект столкнулся с действительно странной проблемой с JPA findOne(id)
, возвращающей прокси-объект вместо полного объекта.
Вот сценарий.Рассмотрим сущности и их связи, показанные ниже.
@Table(name = "HOUSE")
@Entity
@EqualsAndHashCode
@Setter
@ReadPermission(expression = "user has rights for template snapshots AND has filter")
public class HouseEntity extends VersionedEntity {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "house", fetch = FetchType.LAZY, orphanRemoval = true)
public List<RoomEntity> getRooms() {
return rooms;
}
@OneToMany(cascade = CascadeType.ALL, mappedBy = "template", fetch = FetchType.LAZY, orphanRemoval = true)
public List<TableEntity> getTables() {
return tables;
}
}
@Entity
@Table(name = "ROOMS")
public class Room {
@ManyToOne(fetch = FetchType.LAZY)
public HouseEntity getHouse() {
return house;
}
@OneToMany(mappedBy = "room", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
public List<TableEntity> getTables() {
return tables;
}
}
@Entity
@Table(name = "TABLES")
public class TableEntity{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "HOUSE_ID")
public HouseEntity getHouse() {
return template;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ROOM_ID")
public RoomEntity geRoom() {
return room;
}
Как видите, House
имеет Tables
и Rooms
, Rooms
также имеет Tables
, а каждая дочерняя сущность имеетподключение к его родителям.
- Добавьте таблицу в
HouseEntity
- Снимите таблицу с
HouseEntity
сразу после.
Для 1houseRepository.findById
получает мой HouseEntity
, завернутый в прокси, как будто он загружен лениво.
Странная часть в том, что если я сделаю:
- Добавить таблицу
RoomEntity
, который является потомком HouseEntity
. - Удалить таблицу из
RoomEntity
.
Затем houseRepository.findById
возвращает HouseEntity
без прокси.
Мой вопрос здесь, почему это произошло?Почему в этом случае метод findById
возвращает прокси-объект?Мне нужно иметь доступ к обычному объекту без прямого прокси-сервера, даже если в прокси-объекте объект заполнен в целевом объекте.