Eclipselink - идентификатор после сохранения по-прежнему нулевой - PullRequest
2 голосов
/ 26 ноября 2010

У меня проблема с сохранением сущности и получением идентификатора после того, как возникла ошибка.Я вижу, что данные были созданы в базе данных с правильным идентификатором, но идентификатор все еще нулевой для объекта.

Вот моя сущность:

@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 () приводит к нулю.Как я могу избежать этого?

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

Я исправил проблему. Корень проблемы - это порядок команд для сохранения закладки. Это правильный порядок:

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

Итак, прежде всего вы должны сохранить сущность, а затем вы можете объединить сущность отношений этой сущности.

1 голос
/ 27 ноября 2010

Я не знаком со стратегией генерации Identity PK, возможно, вам следует добавить @ReturnInsert в столбец @Id, чтобы заставить PK возвращаться в операторах вставки.

...