Eclipselink - 持久化后的ID仍为空

时间:2010-11-26 15:21:40

标签: orm jpa entity nullpointerexception eclipselink

我有一个问题是坚持实体并在持续发生之后获取id。 我可以看到数据是在数据库中创建的,具有正确的id,但对象的id仍为null。

继承我的实体:

@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();

我在最后一行得到一个nullpointer Exception,因为getId()导致null。 我怎么能避免这种情况?

2 个答案:

答案 0 :(得分:1)

我不熟悉Identity PK生成策略,也许您应该将@ReturnInsert添加到@Id列,以强制在插入语句上返回PK。

答案 1 :(得分:1)

我解决了这个问题。问题的根源是命令持久保存书签的顺序。 这是正确的顺序:

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

首先,你必须坚持实体,之后你可以合并该实体的关系实体。