Esto es independiente de la aplicación java, no de la aplicación web. Así que cuando me persistir el objeto como este

public <T> T create(T t) {
    em.getTransaction().begin();
    em.persist(t);
    em.flush();
    em.getTransaction().commit();
    return t;
}

La id dentro de la T t objeto sigue siendo nulo, aunque una nueva fila con datos correctos y el id creado correctamente dentro de la base de datos. Por lo general en mi aplicación web que utilizan @EJB, el id disponible justo después de que persisten, ya que de persistir la entidad objeto en mi contexto de persistencia, no estoy seguro de si tengo mi contexto de persistencia aquí?

Esta es la forma en que me asigna mi id dentro de mi @de Clase de Entidad

@Id
@Basic(optional = false)
@Column(name = "ID")
private Long id;

también puedo hacer la identificación de esta tabla en la base de datos AUTO_INCREMENT, como este

CREATE TABLE Config
(
    ID int NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (ID)
)

Esto es ¿cómo puedo obtener mi EntityManager

EntityManagerFactory emf = Persistence.createEntityManagerFactory("CorePU");
em = emf.createEntityManager();

Aquí es lo que dentro de mi 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>

Por favor ayuda, no estoy seguro de lo que hice mal aquí.

InformationsquelleAutor Thang Pham | 2012-04-05

4 Comentarios

  1. 1

    Como he encontrado en este post el EntityManager tiene un método llamado actualización que va a actualizar su objeto después de persistir en él.

    Por lo que su código será probablemente se parece a esto:

    public <T> T create(T t) {
        em.getTransaction().begin();
        em.persist(t);
        em.refresh(t);
        em.flush();
        em.getTransaction().commit();
        return t;
    }

    Yo no he probado esto, así que no estoy seguro de dónde exactamente a poner el método de actualización de llamada, allí, después de la confirmación, después de la descarga, etc.

    Espero que le puede ayudar.

    Buena suerte.

    • es necesario actualizar los hay. Acaba de hacer flush(). Que las fuerzas de la persistir, y por lo tanto la obtención de la id (una vez que el usuario ha añadido GeneratedValue anotación de curso).
    • Sí, he publicado mi respuesta, ya que no puedo usar @SequenceGenerator, yo uso @TableGenerator with @GeneratedValue` y funciona. Sin embargo, llamando flush() cada vez causa problemas de rendimiento, DataNucleus?
    • flush() trabajó para mí. Usted debe publicar una respuesta. Y si el bien versado suficiente también la dirección de Thang Pham rendimiento de preocupación.
  2. 1

    Sé que no es un persistir sino en la de combinar va a hacer lo mismo de manera más sencilla. Envuelvo mi persistir en una operación de combinación que guarda la entidad en caso de no existir.

    public T persist(T obj) {
        EntityManager em = ThreadLocalPersistenceManager.getEntityManager();
    
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin();
            obj = em.merge(obj);
        } finally {
            if (! tx.getRollbackOnly()) {
                tx.commit();
            }
        }
    
        return obj;
    }
    
    
    /**
     * This will save the object and return the id of the persisted object.
     *  
     * @param obj
     * @return The id of the persisted object.
     */
    public Long save(T obj) {
        persist(obj);
        return obj.getId();
    }
  3. 0

    Aquí está mi respuesta. Probado

    Cuando la asignación de su dni, a pasar de lo que he mencionado, que se

    @Id
    @Basic(optional = false)
    @Column(name = "ID")
    private Long id;

    a

    @Entity
    public class Person {
       @Id
       @TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
           valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
       @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
       private long id;
       ...
    }

    Desde que tengo uso de microsoft SQL server, tengo que usar @TableGenerator. Más información se puede encontrar aquí http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Table_sequencing

Dejar respuesta

Please enter your comment!
Please enter your name here