0

JPA2、Unitils、jUnit + その他のものを使用しています。私の問題は2つのエンティティに関するものです:

@Entity
public class CaseStuff implements Serializable {
....
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long caseStuffId;

@OneToOne(mappedBy = "CaseStuff")
private XCase xcase;
...
}

@Entity
public class XCase implements Serializable {
....
@OneToOne
@JoinColumn(name = "CASESTUFFID")
private CaseStuff caseStuff;
....
}

両方のテーブルがもう一方のテーブルの ID を取得したため、逆にマップすることもできます。jUnit-Test では、Unitils は XCase を含まない 1 つの CaseStuff レコードを挿入します。本当にヌルであることを確認しました。しかし、次のクエリを使用します。

"select s from CaseStuff s where s.xcase is null"

0 個の CaseStuff オブジェクトを返します。「is not null」で同じことを行うと、オブジェクトが返されますが、デバッグ中に CaseStuff.xcase を調べると、明らかに null です。

ここで何がうまくいかないのですか?

EDIT:Hibernateによって生成されたSQLはに変換されます

select
    *
from
    CaseStuff casestuff0_ 
where
     (
        casestuff0_.xcaseid is null
    )

*すべてのフィールド名を * に置き換え

EDIT2: OneToOne-Relation に変更する前は、不要な ManyToOne でした。以前は、jUnit テストにはクエリがありました

"select s from CaseStuff s where not exists (select x from s.xcase x)"

これは、s.xcase がまだ Set であるかのように、何らかの理由で引き続き正しく機能します。

私と一緒にそれを理解しようとするすべての人に感謝します。

4

1 に答える 1

0

エンティティを定義したように、Xcase は外部キーを持ちます

そのため、ID の横にある Xcase テーブルには、Xcase ID への外部キーとして caseStuff_id (または他の名前) があります。

この画像のように (名前を抽象化します)

ここに画像の説明を入力

あなたの場合、 Person は Xcase で、 CaseStuff は PersonDetails です

したがって、おそらく CaseStuff テーブル (永続化プロバイダーによって生成された場合、ケース ID がありません)

構造的に言えば、テーブルがどのように定義されているかを確認するには、db レベルを確認してください。

于 2012-11-10T12:13:49.017 に答える