2010-11-26 8 views
2

J'ai un problème pour conserver une Entité et obtenir l'ID après que la persistance se soit produite. Je peux voir que les données ont été créées dans la base de données, avec le bon identifiant, mais l'identifiant est toujours nul sur l'objet.Eclipselink - L'ID après la persistance est toujours NULL

Heres mon entité:

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

... 
.. 

Et voici mon code où je créer l'entité:

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

Je reçois une exception NullPointer à la dernière ligne, car les résultats getId() dans nul. Comment puis-je éviter cela?

+0

Je définis le niveau de débogage un peu plus haut et vois quelque chose comme ça: RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException Exception interne: org.postgresql.util.PSQLException: ERREUR: la valeur null dans la colonne "id" ne respecte pas la contrainte non nulle Code d'erreur: 0 Appel: INSERT INTO BOOKMARK (CREATEDAT, NOM, COLOR_ID, USER_ID, PAGE_ID) VALEURS (? ,?,?,?,?) \t bind => [2010-11-27, TestBookmark, 1, 1, 3] Requête: InsertObjectQuery (Bookmark avec id null pour la page 22 du livre 'BlaBook' avec l'ID 1) – LeonS

+0

Il semble que cela dépend de Tomcat, parce que mes tests JUnit sont très bien. Quel pourrait être le problème avec le code dans le contexte d'une servlet Tomcat? – LeonS

+0

Un autre fait étrange: sortie de \t \t System.out.println ("Contient:" + em.contains (signet)); est "Contient: faux", il semble donc que l'objet n'est pas géré par le gestionnaire d'entités – LeonS

Répondre

1

J'ai résolu le problème. La racine du problème est l'ordre des commandes pour conserver le signet. C'est le bon ordre:

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

tout ce que vous avez donc d'abord persister l'entité et après que vous pouvez fusionner l'entité des relations de cette entité.

1

Je ne suis pas familier avec la stratégie de génération Identity PK, vous devriez peut-être ajouter @ReturnInsert à votre colonne @Id, pour forcer le PK à être retourné sur les instructions d'insertion.

Questions connexes