Estoy usando JPA (EclipseLink) y Spring. Digamos que tengo una entidad simple con un ID generado automáticamente:
@Entity
public class ABC implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
// ...
}
En mi clase DAO, tengo un método de inserción que llama persist()
a esta entidad. Quiero que el método devuelva el ID generado para la nueva entidad, pero cuando lo pruebo, devuelve en su 0
lugar.
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; // ???
}
}
También tengo una clase de servicio que envuelve el DAO, si eso hace una diferencia:
public class ABCService {
@Resource(name="ABCDao")
ABCDao abcDao;
public int addNewABC(ABC abc) {
return abcDao.insertABC(abc);
}
}
Respuestas:
Solo se garantiza que la identificación se generará en el momento de la descarga. La persistencia de una entidad solo la hace "adjunta" al contexto de persistencia. Entonces, descargue el administrador de la entidad explícitamente:
o devolver la propia entidad en lugar de su ID. Cuando finalice la transacción, se producirá la descarga, y los usuarios de la entidad fuera de la transacción verán el ID generado en la entidad.
fuente
@GeneratedValue
- lo que eso impliqueinsertABC
crea un nuevo objeto? ¿O modificar el anterior?Verifique que la notación @GeneratedValue esté en su clase de entidad Esto le dice a JPA sobre el comportamiento generado automáticamente por la propiedad de su entidad
fuente
Así es como lo hice:
fuente
También puede usar GenerationType.TABLE en lugar de IDENTITY, que solo está disponible después de la inserción.
fuente
Otra opción compatible con 4.0:
Antes de realizar los cambios, puede recuperar los nuevos
CayenneDataObject
objetos de la colección asociada al contexto, así:luego acceda al
ObjectId
para cada uno en la colección, como:Finalmente, puede iterar bajo los valores, donde generalmente el ID generado será el primero de los valores (para una clave de columna única) en el Mapa devuelto por
getIdSnapshot()
, también contiene los nombres de columna asociados a la PK. como clave (s):fuente
Así es como lo hice. Puedes probar
fuente
fuente
em.flush()
no esem.refresh(abc)
.