Quand l'EntityManager engager?
J'ai le service suivant...
@Stateless
@LocalBean
public class RandomService {
@EJB RandomString stringTokenizer;
@PersistenceContext
EntityManager em;
public String generate(Actions action)
{
Token token = new Token();
token.setAction(action);
token.setExpiry(new Date());
token.setToken(stringTokenizer.randomize());
em.persist(token);
//em.flush();
return String.format("%010d", token.getId()) + token.getToken();
}
}
Si je ne mets pas em.flush (), puis la ligne de jeton.getId() renvoie la valeur null (à l'Aide de DB SÉQUENCE produite) même si je sais que si je retourne un Jeton à la place de la chaîne de l'appel de service, le code est défini. Il semble donc que les EM bouffées de chaleur lorsque le service retourne un jeton objet, mais pas quand je mets de la Chaîne. En mettant tire la chasse, j'obtiens ce que je veux, c'est que ce que le droit?
OriginalL'auteur user432024 | 2011-10-26
Vous devez vous connecter pour publier un commentaire.
Ne confondez pas rincer avec de l'engagement. Au cours de
flush()
fournisseur JPA physiquement envoie SQL généré à la base de données et, dans votre cas, se lit l'IDENTIFIANT généré et le remplit de la fève.Notez que vous devez toujours utiliser le retour de l'entité plutôt que l'original, on est passé àpersist()
:De commettre, d'autre part, effectue la base de données de validation. Évidemment, il va déclencher
flush()
premier, mais il ne sera pas vous aider ici. Mais puisque vous êtes à la demande - toutes les méthodes de l'EJB est transactionnelle par défaut. Cela signifie que la transaction est validée lorsque vous quittez la première EJB sur la pile: si vous appelez l'un EJB à partir d'un autre, le destinataire de l'appel se joint à l'appelant de transaction par défaut (voir: transaction propagation comportement).Noter également que les règles quand
flush()
sont un peu compliqué, car chaque fournisseur essaie de le faire le plus tard possible et en lots.My bad, c'est la
merge()
qui renvoie la nouvelle instance, paspersist()
. Néanmoins, vous avez besoin deflush()
explicitement.Merci. Donc, ce qui est de votre bien sur le code ci-dessus, dois-je faire la mise en forme à l'endroit ou à un niveau plus élevé en l'appelant?
OriginalL'auteur Tomasz Nurkiewicz