2010-05-25 5 views
1

JPA에서 SystemUser 엔티티를 저장하려고합니다. 또한 SystemUser를 만든 사람과 시스템 사용자를 마지막으로 수정 한 사람과 같은 특정 항목을 저장하려고합니다.JPA의 자체 참조 객체

@ManyToOne(targetEntity = SystemUser.class) 
@JoinColumn 
private SystemUser userWhoCreated; 

@Temporal(TemporalType.TIMESTAMP) 
@DateTimeFormat(iso=ISO.DATE_TIME) 
private Date timeCreated; 

@ManyToOne(targetEntity = SystemUser.class) 
@JoinColumn 
private SystemUser userWhoLastModified; 

@Temporal(TemporalType.TIMESTAMP) 
@DateTimeFormat(iso=ISO.DATE_TIME) 
private Date timeLastModified; 

또한 이러한 값이 유지 될 때 null이 아닌지 확인하고자합니다. 그래서 NotNull JPA 주석을 사용하면 쉽게 해결할 수 있습니다 (다른 엔티티 참조와 함께)

문제 설명은 간단합니다. DataLoader 클래스를 사용하려면 시스템에 rootuser가 없어도 rootuser를 저장할 수 없습니다. JPA 엔티티를 지속시킵니다. 나중의 다른 모든 사용자는 userWhoModified를 "systemuser"로 쉽게 지속 할 수 있지만 systemuser 자체는이 스키마에 추가 할 수 없습니다.

이렇게 첫 번째 시스템 사용자를 유지하는 방법이 있습니까 (SQL로 생각하고 있습니다). 이것은 내가 생각하는 전형적인 부트 스트랩 (chicken or egg) 문제입니다.

+2

은 커뮤니티 위키가 아니어야합니다. – Bozho

+2

@Bozho LOL, 처음으로 반체제 위키 경찰을 보았습니다. –

답변

1

rootUser.setUserWhoLastModified(rootUser)을 사용해 보셨습니까?

+0

예, 실제로 시도해 보았습니다. 저장할 때 작동합니다. ROOs를 사용할 때 반복적 인 참조 문제가 발생했습니다. root 사용자는 문자열에 roo 사용자가있는 행을 가지게됩니다. (문제가 해결되지 않았습니다.) 제거하면 문제가 해결되지만 여전히 문제가 있는지 궁금합니다. cleaner solution (이는 내가 사람들에게이 특별한 종류의 toString 메소드를 사용하지 말 것을 사람들에게 알릴 필요가 있음을 의미한다.) 내가 본 또 다른 해결책은 LAZY와 bytecodeinstrumentation을 사용하는 것이었다. – geoaxis