JPA: Comment faire pour obtenir l'Id après persistent dans la version autonome d'application java
C'est une application java autonome, pas d'application web. Alors quand j'ai persister l'objet comme ce
public <T> T create(T t) {
em.getTransaction().begin();
em.persist(t);
em.flush();
em.getTransaction().commit();
return t;
}
La id
à l'intérieur de la T t
objet est toujours nulle, même si une nouvelle ligne avec les informations correctes et l'id est créé correctement à l'intérieur de la base de données. Habituellement dans mon application web qui utilisent @EJB
, le id
disponible juste après je persiste, car il persiste, l'entité objet dans mon contexte de persistance, je ne suis pas sûr si j'ai mon contexte de persistance ici?
C'est la façon dont je l'ai associé mon id à l'intérieur de mon @Classe d'Entité
@Id
@Basic(optional = false)
@Column(name = "ID")
private Long id;
aussi je fais l'id de cette table dans la base de données AUTO_INCREMENT
, à l'instar de ce
CREATE TABLE Config
(
ID int NOT NULL AUTO_INCREMENT,
PRIMARY KEY (ID)
)
C'est de cette façon-je obtenir mon EntityManager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("CorePU");
em = emf.createEntityManager();
Voici ce que l'intérieur de mon persistence.xml
<persistence-unit name="CorePU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>com.wf.docsys.core.model.Config</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/XNINFODB"/>
<property name="javax.persistence.jdbc.password" value="xxx"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="xxx"/>
</properties>
S'il vous plaît aider, je ne suis pas sûr de ce que j'ai fait de mal ici.
OriginalL'auteur Thang Pham | 2012-04-05
Vous devez vous connecter pour publier un commentaire.
Essayez d'ajouter un
@GeneratedValue
sur votre champ id.OriginalL'auteur barsju
Que j'ai trouvé sur ce post l'EntityManager ont une méthode appelée actualiser mise à jour de votre objet après vous persistez à lui.
De sorte que votre code sera probablement ressemble à ceci:
Je n'ai pas testé, donc je ne sais pas où exactement de mettre de l'actualisation à l'appel de la méthode, il y a, après la validation, après la chasse d'eau, etc.
Espère que cela peut vous aider.
Bonne chance.
Yup, j'ai posté ma réponse ci-dessous, car je ne peux pas utiliser
@SequenceGenerator
, j'utilise@TableGenerator with
@GeneratedValue " et ça fonctionne. Cependant, fera appelflush()
tous les temps à cause de problèmes de performance, DataNucleus?flush() a travaillé pour moi. Vous devriez poster une réponse. Et si votre bien versé assez également l'adresse de Thang Pham du souci de performances.
OriginalL'auteur Guedes
Je sais que c'est pas un persistent mais la fusion va faire la même chose plus simplement. J'enveloppe mes persistent dans une véritable opération de fusion permettra d'économiser de l'entité si elle n'existe pas.
OriginalL'auteur Chris Hinshaw
Voici ma réponse. Testé
Lors de la cartographie de votre pièce d'identité, d'un commutateur de ce que j'ai ci-dessus, qui est
à
Depuis que j'utilise microsoft SQL server, je dois utiliser
@TableGenerator
. Plus d'informations peuvent être trouvées ici http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Table_sequencingOriginalL'auteur Thang Pham