2012-11-14 3 views
0

내 엔티티 널 아이디와 콜 삽입 엔티티를 지속 : 인스턴스 다음JPA/최대 절전 모드 OneToOne 협회,

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorValue(value="SV") 
public class SupervisorSurvey extends Survey implements Serializable { 

    @OneToOne(mappedBy="supervisorSurvey",cascade=CascadeType.ALL) 
    private SurveyPair surveyPair; 

    [...] 
} 

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorValue(value="US") 
public class UserSurvey extends Survey implements Serializable { 

    @OneToOne(mappedBy="userSurvey",cascade=CascadeType.ALL) 
    private SurveyPair surveyPair; 

    [...] 
} 

: 추상적 인 설문 조사 위

@Entity 
@Table(name="`surveys`") 
@Inheritance 
@DiscriminatorColumn(name="`type`") 
public abstract class Survey implements Serializable, Comparable<Survey> { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 

    [...] 
} 

두 개의 콘크리트 클래스의 종류를 가질 수 있습니다 SurveyPair는 두 종류 중 하나를 부여받습니다 :

@Entity 
@Table(name="`surveypairs`") 
public class SurveyPair implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @OneToOne 
    @JoinColumn(name="`userSurveyId`",unique=true) 
    private UserSurvey userSurvey; 

    @OneToOne 
    @JoinColumn(name="`supervisorSurveyId`",unique=true) 
    private SupervisorSurvey supervisorSurvey; 
} 

이제 문제는 : KE이 : ​​

JPAHelper db = new JPAHelper(); 
EntityManager em = db.getEntityManager(); 
em.getTransaction().begin(); 
em.persist(surveyPair.getUserSurvey()); 
em.persist(surveyPair.getSupervisorSurvey()); 
em.persist(surveyPair); 
em.getTransaction().commit(); 
em.close(); 

은 (UserSurvey 및 SupervisorSurvey 외국 아이디 열 값은 널 (Null)) 정확하게 SurveyPair 삽입되지만 UserSurvey 및 SupervisorSurvey는 NULL이 삽입되어

// survey pair 
SurveyPair surveyPair = new SurveyPair(reference); 

// user side 
UserSurvey usSurvey = new UserSurvey(user); 
usSurvey.setSurveyPair(surveyPair); 
surveyPair.setUserSurvey(usSurvey); 

// supervisor side 
SupervisorSurvey svSurvey = new SupervisorSurvey(Application.getLoggedUser(), user); 
svSurvey.setSurveyPair(surveyPair); 
surveyPair.setSupervisorSurvey(svSurvey); 

SurveyInput.getInstance().persist(surveyPair); 

상기 호출 지속 ID.

왜 이런 일이 발생합니까? persist 메서드 바로 다음에 코드를 디버깅 할 경우 개체 인스턴스의 ID를 검사 할 수 있으며 결과는 실제로 채워집니다.

+0

희망이 도움이 될 수 있습니다 : http://stackoverflow.com/questions/9649515/how-to-get-id-of-last-persisted-entity-using-jpa – perissf

+0

@perissf 불행히도; 빈 세션에서 ID가 올바르게 설정되었습니다. 디버그 세션 중에 볼 수 있듯이 (get_last_insert_id 쿼리를 실행하는 최대 절전 모드를 볼 수도 있습니다). 하지만 null ID 열 값을 가져옵니다. 최대 절전 모드가 테이블 컬럼 위에 기본 키를 두지 않은 것도 이상합니다. –

답변

0

나는 @OneToOne으로 포기하고 @JoinColumn을 contrained unique=true@ManyToOne 관계에 변환 :

@XmlElement(name="userSurvey") 
@ManyToOne(optional=false) 
@JoinColumn(name="`userSurveyId`",unique=true) 
private UserSurvey userSurvey; 

@XmlElement(name="supervisorSurvey") 
@ManyToOne(optional=false) 
@JoinColumn(name="`supervisorSurveyId`",unique=true) 
private SupervisorSurvey supervisorSurvey; 

작동 그 방법; 그럼에도 불구하고 질문이 특정 주석에 초점을 맞추기 때문에 누군가가 그러한 해결책을 생각해 내면 @OneToOne을 사용하여 대체 답변을 수락합니다.

1

엔티티와 함께 ​​persist()를 호출하면 JPA는 데이터베이스에 대한 새 객체를 만듭니다. id에 @GeneratedValue (strategy = GenerationType.AUTO)를 사용하면 JPA가 id 생성을 담당합니다. JPA가 플러시 시간에 관련 엔티티 ID를 생성하기 때문에 entityManager 인스턴스를 플러시해야합니다.

Entity entity = new Entity(); 
entity.setAddresse("Address"); 
em.persist(entity); 
em.flush(); 

플러시 후 ID 엔티티 ID가 표시됩니다.

관련 문제