【发布时间】:2012-11-02 13:59:40
【问题描述】:
我的实体如下:
@Entity
@Table(name="`surveys`")
@Inheritance
@DiscriminatorColumn(name="`type`")
public abstract class Survey implements Serializable, Comparable<Survey> {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
[...]
}
抽象的Survey上面可以有两种具体的类:
@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;
[...]
}
然后,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;
}
现在的问题:在我创建这样的对象之后:
// 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);
上述调用坚持:
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();
正确插入 SurveyPair(UserSurvey 和 SupervisorSurvey 的外部 ID 列值不为空),但插入 UserSurvey 和 SupervisorSurvey 时使用 NULL ID。
为什么会这样? 如果我在persist 方法之后调试代码,我可以检查对象实例的ID 并实际填充它们。
【问题讨论】:
-
@perissf 很遗憾没有;正如我在调试会话期间看到的那样,在 bean 中正确设置了 ID(我还可以看到 hibernate 执行 get_last_insert_id 查询)。但我得到一个空 ID 列值。 hibernate 没有在该表列上放置主键也很奇怪。
标签: java hibernate jpa one-to-one