1

私のエンティティは次のとおりです。

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

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

    [...]
}

上記の抽象調査は、2 種類の具象クラスを持つことができます。

@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 列の値は null ではありません) が、UserSurvey および SupervisorSurvey は NULL ID で挿入されます。

なぜこれが起こるのですか?persist メソッドの直後にコードをデバッグすると、オブジェクト インスタンスの ID を調べることができ、実際にデータが取り込まれます。

4

2 に答える 2

0

私はあきらめて、制約付きの関係で@OneToOneそれを変換しました:@ManyToOneunique=true@JoinColumn

@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ただし、質問はその特定の注釈に焦点を当てているため、誰かがそのような解決策を思いついた場合は、別の回答を受け入れます。

于 2012-11-16T03:37:40.923 に答える