내 엔티티 널 아이디와 콜 삽입 엔티티를 지속 : 인스턴스 다음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를 검사 할 수 있으며 결과는 실제로 채워집니다.
희망이 도움이 될 수 있습니다 : http://stackoverflow.com/questions/9649515/how-to-get-id-of-last-persisted-entity-using-jpa – perissf
@perissf 불행히도; 빈 세션에서 ID가 올바르게 설정되었습니다. 디버그 세션 중에 볼 수 있듯이 (get_last_insert_id 쿼리를 실행하는 최대 절전 모드를 볼 수도 있습니다). 하지만 null ID 열 값을 가져옵니다. 최대 절전 모드가 테이블 컬럼 위에 기본 키를 두지 않은 것도 이상합니다. –