0

自動インクリメントする id 列を持つテーブルと、注釈が付けられたゲッターを持つ Java オブジェクトがあります@GeneratedValue(strategy = GenerationType.AUTO)。これは保存時にうまく機能しますが、単体テストでは決定論的であるように ID を指定したいと考えています。MySQL (使用している DB) では、insert ステートメントで値を指定でき、すべて正常に動作します。ただし、Java オブジェクトに id フィールドを設定して永続化しようとすると、休止状態が例外をスローします。通常生成される値の値を Hibernate で指定できるようにするにはどうすればよいですか?

フィールドの例:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
    return this.id;
}

MySQL で動作:

INSERT INTO myTable (id, str)
VALUES (10,'this works!')

動作しません:

MyObject myObject = new MyObject();
myObject.setId(10L); //remove this line and hibernate saves ok
myObject.setStr("this does not work.");
daoForMyObject.persist(myObject); //throws org.springframework.dao.DataIntegrityViolationException

優れたテスト駆動型開発者になるのを手伝ってくれて、前もって感謝します!

4

1 に答える 1

4

おそらくあなたが望まない方法で答えて申し訳ありませんが、あなたの考えは悪いと思います. あなたの目標が優れたテスト駆動型の開発者になることである場合は、これを行わないでください。基本的に、テストしたいものを妨害しています。テスト中にユニットに特別な動作を要求します。ただし、単体テストでは、単体をそのままテストする必要があります。

hibernate で autoincrement (またはそのような) フィールドに固定値を設定できる場合、これは hibernate のバグと見なすことができます。私が見る限り、休止状態がそれを許可しないのは良いことです。

session.save()メソッド呼び出しの後に id 値を読み取らないのはなぜですか? おそらくあなたのdaoForMyObject.persist()呼び出しsave()なので、その直後にIDを読むことができます:

MyObject myObject = new MyObject();
myObject.setStr("this does work.");
daoForMyObject.persist(myObject);
Long id = myObject.getId();

10 の代わりにエンティティを参照するために使用idするようになりました...なぜこのようにできないのでしょうか?

于 2011-09-10T19:19:11.037 に答える