java - onetomany - ¿Por qué JPA persistir() no genera identificación primaria de incremento automático?
onetomany jpa ejemplo (3)
El problema es que estás usando la generación de IDENTIDAD id. La generación de id. De IDENTIDAD no puede realizar la asignación previa ya que requieren el INSERT para generar el id. La preasignación de soporte de generación de ID de TABLE y SEQUENCE, y siempre recomendaría su uso, y nunca usar IDENTITY debido a este problema y debido al rendimiento.
Puede activar el id que se generará cuando use IDENTITY id generation llamando a flush ().
Estoy usando JPA toplink-essential y SQL Server 2008
Mi objetivo es obtener un valor de clave primaria de incremento automático de los datos que se insertarán en la tabla. Sé en JDBC que hay getInsertedId () como método que le da el id. De identificación automática de incremento automático (pero eso es después de que se ejecutó la instrucción de inserción)
En JPA, descubrí que la @GenratedValue annotation
puede hacer el truco.
@Entity
@Table(name = "tableOne")
public class TableOne implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "tableId")
private Integer tableId;
Ahora si ejecuto el código a continuación, debería darme el ID auto incrementado pero devuelve NULL ...
EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();
EntityTransaction txn = em.getTransaction();
txn.begin();
TableOne parent = new TableOne();
em.persist(parent); //here I assume that id is pre-generated for me.
System.out.println(parent.getTableId()); //this returns NULL :(
También estamos usando SQL Server 2008 y nunca funcionó para mí, así que siempre ejecuto la consulta separada "SELECT @@IDENTY"
para obtener la identificación insertada.
La razón que encontré en la red fue que el ID automático (IDENTIDAD) es administrado por la base de datos y nunca fue recuperado en Entidad hasta que a menos que usted confirme la fila o recupere manualmente la información de la base de datos.
simplemente haz esto:
public void create(T entity) {
getEntityManager().persist(entity);
getEntityManager().flush();
getEntityManager().refresh(entity);
}
Después de actualizar la entidad, tiene el campo ID con el valor adecuado.