업데이트NullPointerException가 최대 절전 모드 withi 봄 부팅
내가 @ sainr의 대답 Converting Hibernate proxy to real entity object이 문제를 해결 않습니다 싶습니다 FetchType.LAZY으로 발생합니다. 그러나이 장면의 문제는 내 SiteEntity
이 final
수식어가 setControllerEntity
이고 getControllerEntity
인데 내 질문에 제기하지 않았습니다. 그리고 나는 사과한다.
final
수정자를 제거하십시오. 그런 다음 Hibernate는 프록시 객체를 잘 초기화 할 수있다.
설명은 스택 오버플로의 answer에서 찾을 수 있습니다. 나는 장치 개체를 발견 한 후
@Entity
@Table(name = "controller")
public class ControllerEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false, updatable = false)
private long id;
}
@Entity
@Table(name = "site")
public class SiteEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "controller_id", nullable = false)
private ControllerEntity controllerEntity;
}
@Entity
@Table(name = "device")
public class DeviceEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(nullable = false)
private long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "site_id", nullable = true)
private SiteEntity siteEntity;
}
을 다음과 같은
내가 세 가지 요소를 가지고, 나는 그것에서 직접 controllerEntity
를 얻을하려고합니다.
final DeviceEntity deviceEntity1 = deviceRepository.findOne(1L);
System.out.println(deviceEntity1.getSiteEntity().getControllerEntity().getId());
하지만 그것은 siteEntity
에서 null
controllerEntity
의해 발생되는 결과 java.lang.NullPointerException
.
siteRepositoy
을 사용하여 siteEntity를 다시 가져 오려고 했는데도. 그 중 controllerEntity
은 여전히 null
입니다.
DeviceEntity와 SiteEntity 둘 다에서 fetch = FetchType.LAZY
을 제거한 후 NPE가 더 이상 발생하지 않습니다.
하지만 이상하게 보입니다. 최대 절전 모드에서 올바른 값을 가져 오는 것을 기대하면서 FetchType.LAZY
을 사용할 수 있습니까?
감사합니다.
고마워. 그것은 실제로 무거운 물체를 포함하지 않습니다. 대신에 EAGER로 전환하겠습니다. 그러나 무거운 개체 또는 ManyToMany, OneToMany 매핑과 같은 FetchType.LAZY에 대한 필요성이있는 경우 절전 모드 세션이 닫히거나 "프록시 개체를 실제 개체로 변환"하는 것을 방지하기 위해 어쨌든 갈 수 있습니까? 감사합니다 – Chiu
@Chiu 당신은'TransactionTemplate' 내에서 사용하려고 시도 할 수 있습니다 (또는 홀더 객체를로드하고'@ Transactional'으로 게으른 자식에 접근하는 메소드를 표시 할 수 있습니다) – sainr
"최대 절전 모드 프록시를 실제 엔티티로 변환하기" 객체 "가 문제를 해결합니다. 그러나 장면 뒤에있는 문제는'SiteEntity'의'final' 수정자인'setControllerEntity'와'getControllerEntity'입니다. 'final' 수정자를 제거하십시오. 그러면 Hibernate는 프록시 객체를 잘 초기화 할 수있다. – Chiu