J'utilise JPA (EclipseLink) et Spring. Disons que j'ai une entité simple avec un identifiant généré automatiquement:
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
// ...
}
Dans ma classe DAO, j'ai une méthode d'insertion qui appelle persist()
cette entité. Je veux que la méthode renvoie l'ID généré pour la nouvelle entité, mais lorsque je la teste, elle renvoie à la 0
place.
public class ABCDao {
@PersistenceContext
EntityManager em;
@Transactional(readOnly=false)
public int insertABC(ABC abc) {
em.persist(abc);
// I WANT TO RETURN THE AUTO-GENERATED ID OF abc
// HOW CAN I DO IT?
return abc.id; // ???
}
}
J'ai également une classe de service qui enveloppe le DAO, si cela fait une différence:
public class ABCService {
@Resource(name="ABCDao")
ABCDao abcDao;
public int addNewABC(ABC abc) {
return abcDao.insertABC(abc);
}
}
Réponses:
L'ID est uniquement généré au moment du rinçage. La persistance d'une entité la rend uniquement «attachée» au contexte de persistance. Donc, soit vider explicitement le gestionnaire d'entités:
ou renvoyer l'entité elle-même plutôt que son ID. Lorsque la transaction se termine, le vidage se produira et les utilisateurs de l'entité en dehors de la transaction verront ainsi l'ID généré dans l'entité.
la source
@GeneratedValue
- quoi que cela impliqueinsertABC
crée-t-il un nouvel objet? Ou modifier l'ancien?vérifiez que la notation @GeneratedValue est présente dans votre classe d'entité. Cela indique à JPA le comportement généré automatiquement par votre propriété d'entité
la source
Voici comment je l'ai fait:
la source
Vous pouvez également utiliser GenerationType.TABLE au lieu de IDENTITY qui n'est disponible qu'après l'insertion.
la source
Une autre option compatible avec 4.0:
Avant de valider les modifications, vous pouvez récupérer le ou les nouveaux
CayenneDataObject
objets de la collection associée au contexte, comme ceci:puis accédez au
ObjectId
pour chacun dans la collection, comme:Enfin, vous pouvez itérer sous les valeurs, où généralement l'identifiant généré sera la première des valeurs (pour une clé de colonne unique) dans la carte renvoyée par
getIdSnapshot()
, il contient également le ou les noms de colonne associés au PK comme clé (s):la source
Voilà comment je l'ai fait. Tu peux essayer
la source
la source
em.flush()
ne l' est pasem.refresh(abc)
.