Error al crear registro auto incremental

Developers
j0s3pro
2014-03-06
2014-03-10
  • j0s3pro
    j0s3pro
    2014-03-06

    Buenas, llevo ya unas horas peleandome con la inserción de registros con clave autonumerica y el fallo que me muestra es el siguiente:

    javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist

    Y mis ficheros son los siguientes:

    Campo de la clase:

        @Id @Hidden
    @Column(name = "campoId")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer campoId;
    

    En la base de datos la tengo montada asi:

    CREATE TABLE Tabla (
      `campoId` INT NOT NULL AUTO_INCREMENT,
    

    Y el codigo para crear lo tengo montado de la siguiente manera:

    private Object create(  
        MetaModel metaModel,
        Map values,
        MetaModel metaModelContainer,
        Object container,
        int number, boolean validateCollections) 
        throws CreateException, ValidationException, XavaException, RemoteException {                       
        try {
    
            removeReadOnlyWithFormulaFields(metaModel, values);             
            removeCalculatedFields(metaModel, values);                      
            Messages validationErrors = new Messages();             
            validateExistRequired(validationErrors, metaModel, values, metaModelContainer != null);
            validate(validationErrors, metaModel, values, null, container, true);
            if (validateCollections) validateCollections(validationErrors, metaModel);
            removeViewProperties(metaModel, values);            
            if (validationErrors.contains()) {
                throw new ValidationException(validationErrors);            
            }       
            updateReferencedEntities(metaModel, values);            
            Map convertedValues = convertSubmapsInObject(metaModel, values, false); 
            Object newObject = null;    
            if (metaModel.getContainerReference() == null) {
                newObject = getPersistenceProvider().create(metaModel, convertedValues);
                XPersistence.setPersistenceUnit("backup");
                XPersistence.getManager().persist(newObject);
            } else {                                
                if (metaModelContainer == null) {
                    metaModelContainer = metaModel.getMetaModelContainer();
                    container = convertedValues.get(metaModel.getContainerReference());
                }
                newObject = getPersistenceProvider().createAggregate(                   
                        metaModel,
                        convertedValues,
                        metaModelContainer,
                        container,
                        number);
            }
    
            return newObject;
        } catch (ValidationException ex) {
            throw ex;
    
    }
    

    El fallo lo tengo en la linea donde pone: XPersistence.getManager().persist(newObject);

    Solo me da fallo a la hora de guardar un nuevo elemento, no al modificar, aunque sea otra función, por eso creo que es de la clave autogenerada (a modo de prueba he quitado el autonumerico tanto del Pojo como de la bbdd y me guarda bien).
    Según he leido, tengo que llamar en vez del persist() al merge(), pero ni así funciona.
    También he leido de poner antes de llamar a la clave como valor null, para que se regenere sola pero no puedo hacerlo porque en mi base de datos LEGADA hay tablas de creación autonuméricas y no autonúmericas, asi que estoy que me subo por las paredes.

    ¿Alguien sabe a que se debe este error y como solucionarlo?. El método esta implementado de esa forma porque necesito también grabar en una backup. Gracias por adelantado.

     
    Last edit: j0s3pro 2014-03-06
  • Javier Paniza
    Javier Paniza
    2014-03-10

    Hola j0s3pro,

    posiblemente el create() ya haya hecho el persist() sobre el objeto, por eso se queja.

    Además el setPersistenceUnit() sólo tiene efecto si se usa antes de usar por primera vez el manager. Quizás tendrías que crear un nuevo manager, con createManager().


    Ayuda a otros en este foro como yo te ayudo a ti.