apt stackoverflow 커뮤니티에 굴복하고 겸손하게 지침을 구합니다.JAXB는 EntityManager가 해제(), 폐쇄() 및 null로 설정된 경우에도 FetchType.LAZY로 표시된 필드를 열심히 가져옵니다.
@Entity
@Table(name = "EVENTS")
@XmlRootElement
public class Event extends EventBase {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlAttribute(name = "id")
private long eventCID;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "APPLICATIONCID")
private CustomerApplication customerApplication;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CUSTOMERCID")
private Customer customer;
....
}
여기에 내 코드에의 (BTW EventBase 추가 필드를 보유하고 단지 @MappedSuperclass입니다) :
내가 JPA /는 EclipseLink/JAXB/목시 주석의 혼합물을 가지고 다음과 같은 Entity 클래스/콩 한
이 엔티티를 마샬링합니다 (간결성을 위해 외부 클래스 제외됨)public static void main(String args[]) {
Event event = myInstance.populateEvent();
myInstance.buildXMLFromEvent(event);
}
public Event populateEvent() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory(this.persistenceUnit);
EntityManager em = null;
Event event = null;
try {
em = emf.createEntityManager();
event = (Event) em.createQuery("Select object(e) from Event e where e.eventCID = 55000").getSingleResult();
em.clear();
em.detach(event);
em.close();
em = null;
emf.close();
emf = null;
} catch (Exception e) { // just test code so catching general exception
log.error("Unexpected error: " + e);
} finally {
if (em != null) {
em.clear();
em.close();
}
}
return event;
}
private void buildXMLFromEvent(Event event) {
System.out.println("Marshalling now:");
JAXBContext jc;
try {
jc = JAXBContext.newInstance(Event.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.valueOf(true));
JAXBElement<Event> jaxbElement = new JAXBElement<Event>(new QName("event"), Event.class, event);
marshaller.marshal(jaxbElement, System.out);
} catch (JAXBException e) {
}
}
생성 된 xml은 실제로 내 Event Entity Bean의 모든 구성원 객체를 간절히 가져옵니다. 즉, Customer, CustomerApplication 및 기타 간략한 설명을 위해 제외 된 매핑. EclipseLink를 JPA 제공 업체로, Moxy를 JAXB 용으로 사용하고 있습니다. 여기서 내가 뭘 잘못하고 있니? entityManager 및 entityManagerFactory 인스턴스가 지워지고 닫히고 null로 설정 될뿐만 아니라 루트 이벤트 엔티티도 분리되었음을 알 수 있습니다. 또한 fetchtype은 명시 적으로 LAZY!로 설정되었습니다.
이벤트 객체가 분리되었을 때 JAXB가 어떻게 열렬히 가져올 수 있습니까? entityManager를 닫으면 모든 관리 객체가 분리되는 것 같습니다. JAXB가 걸려있는 캐시 된 세션 컨텍스트가 있습니까? 그렇다면 명시 적으로 정의 된 가져 오기 전략을 준수하지 않는 이유는 무엇입니까? 미리 감사드립니다.
스타드
좋아, 클래스 수준에서 @XmlAccessorType (XmlAccessType.FIELD) 주석을 추가하면 이제 해당 멤버 개체를 가져올 수 없습니다. 나는 여전히 개체가 닫힌/지워진/null entityManager를 사용하여 가져올 수있는 방법에 대해 여전히 혼란 스럽다. 뭔가를 놓치지 않는 한 - 나는 아마있을 것이다! – ustad
엔티티를 직접 노출 시켜서 디자인을 개선하고, DTO 객체를 생성하고, 직접 뷰를 제어 할 수있는 것은 좋지 않습니다. –
안녕 Alexey, 감사합니다. 예제가 반드시 필요한 것은 아닙니다. 내 디자인을 비추고, 일러스트레이션을 위해 이것을 만들었습니다 ... – ustad