2010-11-26 5 views
2

エンティティを保持し、永続化が発生した後にIDを取得するのに問題があります。 データが正しいIDでデータベースに作成されたことがわかりましたが、idはまだオブジェクトでnullです。Eclipselink - 永続化後のIDがまだヌルです

HERESに私のエンティティ:

@Entity 
public class Bookmark { 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
private Long id; 

private String name; 

@Column(nullable = false) 
@Temporal(TemporalType.DATE) 
private Date createdAt; 

@ManyToOne 
private Page page; 

@ManyToOne 
private Color color; 

@ManyToOne 
private User user; 

... 
.. 

そして、ここでは、私はエンティティを作成し、私のコードです:

//init bookmark from json basic data 
Bookmark bookmark = new Bookmark(currentUser,page); 

bookmark.setName(name); 
bookmark.setColor(color); 

//set User relationship for the bookmark 
currentUser.getBookmarks().add(bookmark); 

//save the altered entities 
tx.begin(); 
em.merge(currentUser); 
em.persist(bookmark); 
tx.commit(); 


//Build the response 
System.out.println("uriInfo:"+uriInfo+ "bookmark:"+bookmark); 
URI bookmarkUri = uriInfo.getAbsolutePathBuilder().path(bookmark.getId().toString()).build(); 

のgetId()の結果であるため、私は最後の行でnullポインタ例外を取得していますヌル。 どうしたらいいですか?

+0

私はデバッグレベルを多少高く設定しています。RollbackException:Exception [EclipseLink-4002](Eclipse Persistence Services - 2.1.1.v20100817-r8050):org.eclipse.persistence.exceptions.DatabaseException 内部例外:org.postgresql.util.PSQLException:ERROR:カラム "id"のnull値がnullでない制約に違反しています エラーコード:0 呼び出し:INSERT INTO BOOKMARK(CREATEDAT、NAME、COLOR_ID、USER_ID、PAGE_ID)VALUES(? )。 \t bind => [2010-11-27、TestBookmark、1、1、3] Query:InsertObjectQuery(ブックID:22のブックマークIDは、IDが「BlaBook」 1) – LeonS

+0

私のJUnitテストがうまくいっているので、Tomcatに依存しているようです。 Tomcatサーブレットのコンテキストでコードに間違いがありますか? – LeonS

+0

もう1つ奇妙な事実:出力\t \t System.out.println( "以下を含みます:" + em.contains(bookmark));は「Contains:false」であるため、オブジェクトはエンティティマネージャによって管理されていないようです – LeonS

答えて

1

問題を修正しました。問題の根本は、ブックマークを永続化するコマンドの順序です。 は、これは正しい順序である:あなたがエンティティを永続化する必要があり、すべての

em.persist(bookmark); 
em.merge(currentUser); 

だから最初、その後、あなたは、そのエンティティの関係のエンティティをマージすることができます。

1

私はID PK生成戦略に慣れていません。列に@ReturnInsertを追加して、PKを強制的に挿入文に戻す必要があります。

関連する問題