2011-09-10 1 views
0

私は、自動インクリメントするid列を持つ表と、ゲッターに@GeneratedValue(strategy = GenerationType.AUTO)を注釈したJavaオブジェクトを持っています。これは節約するときに効果的ですが、単体テストの場合はIDを指定して確定的に指定します。 MySQL(私たちが使用しているDB)では、insert文に値を指定することができ、すべて正常に動作します。しかし、私は、Javaオブジェクト内のidフィールドを設定し、永続化しようとすると、休止状態は例外をスローします。 Hibernateに、一般的に生成された値の値を指定させる方法を教えてください。Java/Hibernate:autoincrement/@GeneratedValueを持つ列に特定の値を挿入するにはどうすればいいですか?

フィールド例:MySQLで

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

作品:

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 

感謝を!

答えて

1

これは以前に尋ねられましたが、提案された解決策hereがあります。お役に立てれば。この投稿はthis stackoverflow questionsからリンクされています。

4

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

hibernateがautoincrement(またはそのような)フィールドの固定値を設定させる場合、これはhibernateのバグとみなされる可能性があります。私が見ているように、それは冬眠はそれを許可していませんが良いです。

session.save()メソッド呼び出し後にid値を読み取ってみませんか?おそらくあなたのdaoForMyObject.persist()通話あなたがIDを読み取ることができsave()、その直後:

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

今の代わりに10のエンティティを参照するためにidを使用するには...なぜあなたは、このようにそれを行うことができるべきではないのですか?

+0

これは実際に私がこの投稿を投稿してからテストで始めた方法です:-Pしかし、私は、自動インクリメントフィールドの値を明示的に設定する方法はまだ不思議です。 MySQLはこれを行うことができます。もしhibernateがMySQLと同じ動作をしていればいいでしょう - 提供されていなければautoの値を使ってください。それがバグだとは思わないでください。 – Zugwalt

関連する問題