2011-11-28 20 views
6

Netbeans 7.01を使用してJSF 2.0およびJPAのチュートリアルを実行しようとしています。私はoracle XEとJDBC_6を使用しています。エンティティウィザードのJSFページを使用してJSFページを生成しました。私はデータベースからデータを取得して表示できるので、すべて正常に動作します。私はデータベースのレコードを作成または更新しようとしたときしかし、私はこのエラーを取得する:永続性エラーメッセージ:null操作のPKのインスタンスが誤って検索操作に提供されました

An instance of a null PK has been incorrectly provided for the find operation

これが原因とされており、どのように私はそれを解決できますか? PKがここnullであることを

Entity entity = em.find(Entity.class, null); 

注:

+0

null PKのどのビットが "見つからない"に渡されましたか? (そして実際にem.findメソッドに渡すものと比較してください)。 – DataNucleus

答えて

9

これは基本的に次のやったことを意味します。問題を解決するには、nullではないことを確認してください。

4

これは、まだ保持されていないエンティティに対して検索操作を実行している可能性があります。どの状況では、@IDフィールド(自動生成されている場合)は値を持たない。 nullになります。あなたはエンティティを見つけようとしています。@ BalusCが指摘するように、あなたはfindメソッドにnull値を送ります。

2

これは、エンティティを永続化しようとすると、エンティティのPKをnullとして送信していることを意味します。

だから、あなたは3つのオプションがあります。

  • は手動でエンティティのPKを定義します。
  • データベースがシリアル(Informix、MS SQLSERVERなど)のようなタイプを使用している場合、値はIDMSTI戦略を使用できるRDMSによって自動インクリメントされるため、エンティティのpkにnull値を渡すことができます。

    @Entity 
    public class Inventory implements Serializable { 
         @Id 
         @GeneratedValue(strategy=GenerationType.IDENTITY) 
         private long id; 
    
  • データベースは、あなたが使用できるように、値が列によって提供されて生成PKS(オラクル、Postgresqlの、など)のための配列使用している場合:詳細については

    @Entity 
    public class Inventory implements Serializable { 
        @Id 
        @GeneratedValue(generator="InvSeq") 
        @SequenceGenerator(name="InvSeq",sequenceName="INV_SEQ", allocationSize=5) 
        private long id; 
    

をあなたは見ることができます:http://wiki.eclipse.org/EclipseLink/Examples/JPA/PrimaryKey

関連する問題