problem hibernate Envers "ID" Invaled Identifier

2

Good morning, my problem is as follows.

I have to audit the entities of my application. For this I use the Hibernate Envers tool.

I have all the entities I want to persist annotated with @Audited . I have also added the _AUD and REVINFO tables with their respective fields REV, REVTYPE and REV, REVTSTMP . I also have created the sequence HIBERNATE_SEQUENCE that is needed.

I need to add to the table REVINFO other columns to add additional information such as the user who made the transaction, the ip from where it was made, etc.

For this I have created the class RenInfo which extends from DefaultRevisionEntity :

@Entity
@RevisionEntity(RevInfoListener.class)
public class Revinfo extends DefaultRevisionEntity{

    /**
     * 
     */
    private static final long serialVersionUID = -4464220985145031968L;

    @Column(name="USER_NAME")
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

     @ManyToOne(optional=false)
     @JoinColumn(name="userID",referencedColumnName="ID")
     private User auditor;

}

And the Listener class to be able to add additional information:

package com.minhap.listener;

import org.hibernate.envers.RevisionListener;
import org.springframework.beans.factory.annotation.Autowired;

import com.minhap.Util.AutowireHelper;
import com.minhap.model.Revinfo;
import com.minhap.security.SecurityService;

public class RevInfoListener implements RevisionListener {

    @Autowired
    private SecurityService securityService;

    @Override
    public void newRevision(Object revisionEntity) {
        Revinfo entity = (Revinfo)revisionEntity;
        AutowireHelper.autowire(this);
        entity.setUsername(securityService.getLogged().getName());

    }

    public SecurityService getSecurityService() {
        return securityService;
    }

    public void setSecurityService(SecurityService securityService) {
        this.securityService = securityService;
    }

}

The Class User :( What is it that I'm doing tests with?

package com.minhap.model;

import java.io.Serializable;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Named;
import javax.persistence.*;

import org.hibernate.envers.Audited;

@Entity
@Named
@Table(name = "USERS")
@Audited
public class User implements Serializable{

    private static final long serialVersionUID = 4092545745731449659L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ")
    @SequenceGenerator(sequenceName = "USER_SEQ", allocationSize = 1, name = "USER_SEQ")
    private Long id;
    private Timestamp fx_High;
    private Timestamp fx_Modification;
    public String certificate;
    private String nif;
    private String name;
    private String password;
    private String firstname;
    private String lastname;
    private String email;
    private Long phone;
    private Long state;


    public User() {
        super();
    }
    @Transient
    private List<Privilege> privileges;

   @OneToMany(mappedBy="user" )
    private List<Solicitude> solicitude;

   @OneToMany(mappedBy="user_res" )
   private List<Solicitude> solicitude_res;

    @ManyToMany()
    @JoinTable( 
        name = "user_role",
        joinColumns = @JoinColumn(
          name = "users_id", referencedColumnName = "id"), 
        inverseJoinColumns = @JoinColumn(
          name = "role_id", referencedColumnName = "id")) 
    private List<Role> roles  = new ArrayList<>();


    @ManyToMany()
    @JoinTable( 
        name = "manager", 
        joinColumns = @JoinColumn(
          name = "users_id", referencedColumnName = "id"), 
        inverseJoinColumns = @JoinColumn(
          name = "sp_id", referencedColumnName = "id")) 
    private List<Sp> sp_manager  = new ArrayList<>();

    @ManyToMany()
    @JoinTable( 
            name = "contact", 
            joinColumns = @JoinColumn(
              name = "users_id", referencedColumnName = "id"), 
            inverseJoinColumns = @JoinColumn(
              name = "sp_id", referencedColumnName = "id")) 
     private List<Sp> sp_contact  = new ArrayList<>();

    @ManyToMany()
    @JoinTable( 
        name = "rmanager", 
        joinColumns = @JoinColumn(
          name = "users_id", referencedColumnName = "id"), 
        inverseJoinColumns = @JoinColumn(
          name = "spr_id", referencedColumnName = "id")) 
    private List<SpR> spr_manager  = new ArrayList<>();

    @ManyToMany()
    @JoinTable( 
            name = "rcontact", 
            joinColumns = @JoinColumn(
              name = "users_id", referencedColumnName = "id"), 
            inverseJoinColumns = @JoinColumn(
              name = "spr_id", referencedColumnName = "id")) 
     private List<SpR> spr_contact  = new ArrayList<>();

    @PostLoad
    private void loadPrivileges() {
        privileges = new ArrayList<>();
        Map<Long, Privilege> mapPrivileges = new HashMap<>();

        for (Role rol : roles) {
            for (Privilege privilege : rol.getPrivileges()) {
                if (!mapPrivileges.containsKey(privilege.getId())) {
                    mapPrivileges.put(privilege.getId(), privilege);
                }
            }
        }

        privileges = new ArrayList<>(mapPrivileges.values());
    }

   @Override
   public int hashCode() {
       final int prime = 31;
       int result = 1; 
       result = (prime * result) + ((email == null) ? 0 : email.hashCode());
       return result;
   }

   @Override
   public boolean equals(final Object obj) {
       if (this == obj) {
           return true;
       }
       if (obj == null) {
           return false;
       }
       if (getClass() != obj.getClass()) {
           return false;
       }
       final User user = (User) obj;
       if (!name.equals(user.name)) {
           return false;
       }
       return true;
   }

   @Override
   public String toString() {
       final StringBuilder builder = new StringBuilder();
       builder.append("Users [id=").append(id).append(", name=").append(name)
              .append(", roles=").append(roles).append("]");
       return builder.toString();
   }

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

public Timestamp getFx_High() {
    return fx_High;
}

public void setFx_High(Timestamp fx_High) {
    this.fx_High = fx_High;
}

public Timestamp getFx_Modification() {
    return fx_Modification;
}

public void setFx_Modification(Timestamp fx_Modification) {
    this.fx_Modification = fx_Modification;
}

public String getCertificate() {
    return certificate;
}

public void setCertificate(String certificate) {
    this.certificate = certificate;
}

public String getNif() {
    return nif;
}

public void setNif(String nif) {
    this.nif = nif;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getFirstname() {
    return firstname;
}

public void setFirstname(String firstname) {
    this.firstname = firstname;
}

public String getLastname() {
    return lastname;
}

public void setLastname(String lastname) {
    this.lastname = lastname;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public Long getState() {
    return state;
}

public void setState(Long state) {
    this.state = state;
}

public List<Privilege> getPrivileges() {
    return privileges;
}

public void setPrivileges(List<Privilege> privileges) {
    this.privileges = privileges;
}

public List<Role> getRoles() {
    return roles;
}

public void setRoles(List<Role> roles) {
    this.roles = roles;
}

public Long getPhone() {
    return phone;
}

public void setPhone(Long phone) {
    this.phone = phone;
}

public List<Sp> getSp_manager() {
    return sp_manager;
}

public void setSp_manager(List<Sp> sp_manager) {
    this.sp_manager = sp_manager;
}

public List<Sp> getSp_contact() {
    return sp_contact;
}

public void setSp_contact(List<Sp> sp_contact) {
    this.sp_contact = sp_contact;
}

public List<SpR> getSpr_manager() {
    return spr_manager;
}

public void setSpr_manager(List<SpR> spr_manager) {
    this.spr_manager = spr_manager;
}

public List<SpR> getSpr_contact() {
    return spr_contact;
}

public void setSpr_contact(List<SpR> spr_contact) {
    this.spr_contact = spr_contact;
}

public List<Solicitude> getSolicitude() {
    return solicitude;
}

public void setSolicitude(List<Solicitude> solicitude) {
    this.solicitude = solicitude;
}

public List<Solicitude> getSolicitude_res() {
    return solicitude_res;
}

public void setSolicitude_res(List<Solicitude> solicitude_res) {
    this.solicitude_res = solicitude_res;
}




}

When I add, modify or delete a user, before adding the RevInfo and RevInfoListener classes, I see that it keeps me well in all the tables and the audit is correct. But with these two classes I get the following error:

Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
        at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1212)
        at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
        at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:89)
        at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:178)
        at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1023)
        ... 144 more
Caused by: org.hibernate.exception.SQLGrammarException: could not execute statement
        at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:63)
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:207)
        at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:45)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2949)
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3449)
        at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89)
        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:582)
        at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:456)
        at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
        at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
        at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282)
        at org.hibernate.envers.internal.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:156)
        at org.hibernate.envers.internal.synchronization.AuditProcessManager$1.doBeforeTransactionCompletion(AuditProcessManager.java:46)
        at org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:928)
        at org.hibernate.engine.spi.ActionQueue.beforeTransactionCompletion(ActionQueue.java:503)
        at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2340)
        at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485)
        at org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorImpl.beforeCompletion(JtaTransactionCoordinatorImpl.java:316)
        at org.hibernate.resource.transaction.backend.jta.internal.synchronization.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:47)
        at org.hibernate.resource.transaction.backend.jta.internal.synchronization.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:37)
        at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
        at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:371)
        at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:91)
        at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
        at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1200)
        ... 148 more
Caused by: java.sql.SQLSyntaxErrorException: ORA-00904: "ID": invalid identifier

        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
        at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1017)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:655)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
    
asked by Adrian Hidalgo Ejeda 26.01.2018 в 14:35
source

1 answer

1

Solved !!

The problem was that I had created the wrong REVINFO table. As you can see, the Entity Revinfo extends DefaultRevisionEntity and therefore inherits the properties:

@Id
    @GeneratedValue
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private long timestamp;

    public int getId() {
        return id;
    }

I created the REVINFO table in BBDD:

 CREATE TABLE "DBADMIN"."REVINFO" 
   (    "REV" NUMBER(10,0) NOT NULL ENABLE, 
    "REVTSTMP" NUMBER(19,0), 
    "USER_NAME" VARCHAR2(200 BYTE), 
     PRIMARY KEY ("REV")

If you realize the PK instead of being called ID is REV. The error said "ID" Identifier invalid. You can do two things to solve the problem

  
  • Rename the REV column by ID.
  •   
  • In the entity class, create the property REV (same name as in the table) and write it down with @Id, and of course remove the inheritance from   DefaultRevisionEntity.
  •   

    I hope you serve them!

        
    answered by 26.01.2018 / 16:15
    source