0

I have no exceptions and everything seems to be okay, but after inserting some data into the database it doesn't persist. I don't know if I need some specific annotation or I failed at some Spring configuration.

Entity bean:

@Entity
@Table(name="IMAGEN")
public class Imagen {

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

    @Column(name="NOMBRE",
            nullable = false)
    private String nombre;

    @Column(name="CATEGORIA",
            nullable = false)
    private String categoria;

    //Getters and setters...

SQL script for the table:

CREATE TABLE IMAGEN(
ID INTEGER IDENTITY PRIMARY KEY,
NOMBRE VARCHAR(64) NOT NULL,
CATEGORIA VARCHAR(32)
);

Imagen repository:

@Repository
public interface RepositorioImagen extends JpaRepository<Imagen,Integer> {}

Imagen service:

@Service
public class ServicioImagen {

    @Autowired RepositorioImagen repo;

    public List<Imagen> getAll(){
        return repo.findAll();
    }

    public void saveImage(Imagen im) {
        repo.save(im);
    }

And controller:

@Controller
public class Controlador {
    @Autowired private ServicioImagen servicioImagen;

    private void someMethod(){
        servicioImagen.getAll().forEach(e -> System.out.println(e));

        Imagen imagen = new Imagen();
        imagen.setNombre("SOMENAME");
        servicioImagen.saveImage(imagen);

        servicioImagen.getAll().forEach(e -> System.out.println(e));
    }

}

I inserted some default records in the table when I created the database, and the method getAll() retrieves them nice, but when I save() a new bean, it doesnt persist in the database (getAll() retrieves the same information as before). I read in this answer to turn on the logger, and then I discovered that Hibernate even commits the query. I don't know what more to do, here's the log of the insert:

2020-03-07 18:33:55.611 TRACE 1236 --- [lication Thread] .i.SessionFactoryImpl$SessionBuilderImpl : Opening Hibernate Session.  tenant=null, owner=null
2020-03-07 18:33:55.612 TRACE 1236 --- [lication Thread] o.h.s.i.AbstractServiceRegistryImpl      : Initializing service [role=org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder]
2020-03-07 18:33:55.612 TRACE 1236 --- [lication Thread] o.h.s.i.AbstractServiceRegistryImpl      : Initializing service [role=org.hibernate.stat.spi.StatisticsImplementor]
2020-03-07 18:33:55.612 DEBUG 1236 --- [lication Thread] o.h.stat.internal.StatisticsInitiator    : Statistics initialized [enabled=false]
2020-03-07 18:33:55.613 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : Opened Session [1956899b-7cc9-4f6a-bb51-5b45abbfed69] at timestamp: 15836024356
2020-03-07 18:33:55.616 DEBUG 1236 --- [lication Thread] o.h.e.t.internal.TransactionImpl         : begin
2020-03-07 18:33:55.616 TRACE 1236 --- [lication Thread] j.i.AbstractLogicalConnectionImplementor : Preparing to begin transaction via JDBC Connection.setAutoCommit(false)
2020-03-07 18:33:55.616 TRACE 1236 --- [lication Thread] j.i.AbstractLogicalConnectionImplementor : Transaction begun via JDBC Connection.setAutoCommit(false)
2020-03-07 18:33:55.617 TRACE 1236 --- [lication Thread] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterBeginCallback
2020-03-07 18:33:55.622 TRACE 1236 --- [lication Thread] .i.SessionFactoryImpl$SessionBuilderImpl : Opening Hibernate Session.  tenant=null, owner=null
2020-03-07 18:33:55.623 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : Opened Session [ac23f2c2-d709-4a5e-a206-68fe3e65bd51] at timestamp: 15836024356
2020-03-07 18:33:55.626 DEBUG 1236 --- [lication Thread] o.h.e.i.DefaultMergeEventListener        : EntityCopyObserver strategy: disallow
2020-03-07 18:33:55.629 TRACE 1236 --- [lication Thread] o.hibernate.engine.spi.IdentifierValue   : ID unsaved-value: null
2020-03-07 18:33:55.630 TRACE 1236 --- [lication Thread] o.h.e.i.AbstractSaveEventListener        : Detached instance of: com.bcadaval.memefinder3020.modelo.beans.Imagen
2020-03-07 18:33:55.630 TRACE 1236 --- [lication Thread] o.h.e.i.DefaultMergeEventListener        : Merging detached instance
2020-03-07 18:33:55.639 TRACE 1236 --- [lication Thread] o.h.e.internal.DefaultLoadEventListener  : Loading entity: [com.bcadaval.memefinder3020.modelo.beans.Imagen#5]
2020-03-07 18:33:55.639 TRACE 1236 --- [lication Thread] o.h.e.internal.DefaultLoadEventListener  : Attempting to resolve: [com.bcadaval.memefinder3020.modelo.beans.Imagen#5]
2020-03-07 18:33:55.639 TRACE 1236 --- [lication Thread] o.h.e.internal.DefaultLoadEventListener  : Object not resolved in any cache: [com.bcadaval.memefinder3020.modelo.beans.Imagen#5]
2020-03-07 18:33:55.639 TRACE 1236 --- [lication Thread] o.h.p.entity.AbstractEntityPersister     : Fetching entity: [com.bcadaval.memefinder3020.modelo.beans.Imagen#5]
2020-03-07 18:33:55.639 DEBUG 1236 --- [lication Thread] org.hibernate.loader.Loader              : Loading entity: [com.bcadaval.memefinder3020.modelo.beans.Imagen#5]
2020-03-07 18:33:55.649 DEBUG 1236 --- [lication Thread] org.hibernate.SQL                        : select imagen0_.ID as ID1_1_1_, imagen0_.CATEGORIA as CATEGORI2_1_1_, imagen0_.NOMBRE as NOMBRE3_1_1_, etiquetas1_.IDIMAGEN as IDIMAGEN1_2_3_, etiqueta2_.ID as IDETIQUE2_2_3_, etiqueta2_.ID as ID1_0_0_, etiqueta2_.NOMBRE as NOMBRE2_0_0_ from IMAGEN imagen0_ left outer join IMAGEN_ETIQUETA etiquetas1_ on imagen0_.ID=etiquetas1_.IDIMAGEN left outer join ETIQUETA etiqueta2_ on etiquetas1_.IDETIQUETA=etiqueta2_.ID where imagen0_.ID=?
2020-03-07 18:33:55.654 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Registering statement [org.hsqldb.jdbc.JDBCPreparedStatement@2673b10e[sql=[select imagen0_.ID as ID1_1_1_, imagen0_.CATEGORIA as CATEGORI2_1_1_, imagen0_.NOMBRE as NOMBRE3_1_1_, etiquetas1_.IDIMAGEN as IDIMAGEN1_2_3_, etiqueta2_.ID as IDETIQUE2_2_3_, etiqueta2_.ID as ID1_0_0_, etiqueta2_.NOMBRE as NOMBRE2_0_0_ from IMAGEN imagen0_ left outer join IMAGEN_ETIQUETA etiquetas1_ on imagen0_.ID=etiquetas1_.IDIMAGEN left outer join ETIQUETA etiqueta2_ on etiquetas1_.IDETIQUETA=etiqueta2_.ID where imagen0_.ID=?], parameters=[[null]]]]
2020-03-07 18:33:55.655 TRACE 1236 --- [lication Thread] o.h.e.jdbc.internal.JdbcCoordinatorImpl  : Registering last query statement [org.hsqldb.jdbc.JDBCPreparedStatement@2673b10e[sql=[select imagen0_.ID as ID1_1_1_, imagen0_.CATEGORIA as CATEGORI2_1_1_, imagen0_.NOMBRE as NOMBRE3_1_1_, etiquetas1_.IDIMAGEN as IDIMAGEN1_2_3_, etiqueta2_.ID as IDETIQUE2_2_3_, etiqueta2_.ID as ID1_0_0_, etiqueta2_.NOMBRE as NOMBRE2_0_0_ from IMAGEN imagen0_ left outer join IMAGEN_ETIQUETA etiquetas1_ on imagen0_.ID=etiquetas1_.IDIMAGEN left outer join ETIQUETA etiqueta2_ on etiquetas1_.IDETIQUETA=etiqueta2_.ID where imagen0_.ID=?], parameters=[[null]]]]
2020-03-07 18:33:55.658 TRACE 1236 --- [lication Thread] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [5]
2020-03-07 18:33:55.659 TRACE 1236 --- [lication Thread] org.hibernate.loader.Loader              : Bound [2] parameters total
2020-03-07 18:33:55.661 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Registering result set [org.hsqldb.jdbc.JDBCResultSet@20fd1f60]
2020-03-07 18:33:55.662 TRACE 1236 --- [lication Thread] org.hibernate.loader.Loader              : Processing result set
2020-03-07 18:33:55.662 TRACE 1236 --- [lication Thread] org.hibernate.loader.Loader              : Done processing result set (0 rows)
2020-03-07 18:33:55.663 TRACE 1236 --- [lication Thread] org.hibernate.loader.Loader              : Total objects hydrated: 0
2020-03-07 18:33:55.665 TRACE 1236 --- [lication Thread] o.h.e.loading.internal.LoadContexts      : Constructing collection load context for result set [org.hsqldb.jdbc.JDBCResultSet@20fd1f60]
2020-03-07 18:33:55.667 DEBUG 1236 --- [lication Thread] o.h.e.l.internal.CollectionLoadContext   : No collections were found in result set for role: com.bcadaval.memefinder3020.modelo.beans.Imagen.etiquetas
2020-03-07 18:33:55.668 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing statement [org.hsqldb.jdbc.JDBCPreparedStatement@2673b10e[sql=[select imagen0_.ID as ID1_1_1_, imagen0_.CATEGORIA as CATEGORI2_1_1_, imagen0_.NOMBRE as NOMBRE3_1_1_, etiquetas1_.IDIMAGEN as IDIMAGEN1_2_3_, etiqueta2_.ID as IDETIQUE2_2_3_, etiqueta2_.ID as ID1_0_0_, etiqueta2_.NOMBRE as NOMBRE2_0_0_ from IMAGEN imagen0_ left outer join IMAGEN_ETIQUETA etiquetas1_ on imagen0_.ID=etiquetas1_.IDIMAGEN left outer join ETIQUETA etiqueta2_ on etiquetas1_.IDETIQUETA=etiqueta2_.ID where imagen0_.ID=?], parameters=[[5]]]]
2020-03-07 18:33:55.668 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Closing result set [org.hsqldb.jdbc.JDBCResultSet@20fd1f60]
2020-03-07 18:33:55.684 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Closing prepared statement [org.hsqldb.jdbc.JDBCPreparedStatement@2673b10e[sql=[select imagen0_.ID as ID1_1_1_, imagen0_.CATEGORIA as CATEGORI2_1_1_, imagen0_.NOMBRE as NOMBRE3_1_1_, etiquetas1_.IDIMAGEN as IDIMAGEN1_2_3_, etiqueta2_.ID as IDETIQUE2_2_3_, etiqueta2_.ID as ID1_0_0_, etiqueta2_.NOMBRE as NOMBRE2_0_0_ from IMAGEN imagen0_ left outer join IMAGEN_ETIQUETA etiquetas1_ on imagen0_.ID=etiquetas1_.IDIMAGEN left outer join ETIQUETA etiqueta2_ on etiquetas1_.IDETIQUETA=etiqueta2_.ID where imagen0_.ID=?], parameters=[[5]]]]
2020-03-07 18:33:55.686 TRACE 1236 --- [lication Thread] o.h.e.jdbc.internal.JdbcCoordinatorImpl  : Starting after statement execution processing [ON_CLOSE]
2020-03-07 18:33:55.686 TRACE 1236 --- [lication Thread] o.h.e.i.StatefulPersistenceContext       : Initializing non-lazy collections
2020-03-07 18:33:55.686 DEBUG 1236 --- [lication Thread] org.hibernate.loader.Loader              : Done entity load
2020-03-07 18:33:55.686 TRACE 1236 --- [lication Thread] o.h.e.i.DefaultMergeEventListener        : Merging transient instance
2020-03-07 18:33:55.691 TRACE 1236 --- [lication Thread] org.hibernate.engine.internal.Cascade    : Processing cascade ACTION_MERGE for: com.bcadaval.memefinder3020.modelo.beans.Imagen
2020-03-07 18:33:55.691 TRACE 1236 --- [lication Thread] org.hibernate.engine.internal.Cascade    : Done processing cascade ACTION_MERGE for: com.bcadaval.memefinder3020.modelo.beans.Imagen
2020-03-07 18:33:55.697 TRACE 1236 --- [lication Thread] o.h.e.i.AbstractSaveEventListener        : Saving [com.bcadaval.memefinder3020.modelo.beans.Imagen#<null>]
2020-03-07 18:33:55.706 TRACE 1236 --- [lication Thread] o.hibernate.event.internal.WrapVisitor   : Wrapped collection in role: com.bcadaval.memefinder3020.modelo.beans.Imagen.etiquetas
2020-03-07 18:33:55.707 TRACE 1236 --- [lication Thread] org.hibernate.engine.spi.ActionQueue     : Adding an EntityIdentityInsertAction for [com.bcadaval.memefinder3020.modelo.beans.Imagen] object
2020-03-07 18:33:55.708 TRACE 1236 --- [lication Thread] org.hibernate.engine.spi.ActionQueue     : Adding insert with no non-nullable, transient entities: [EntityIdentityInsertAction[com.bcadaval.memefinder3020.modelo.beans.Imagen#<delayed:1>]]
2020-03-07 18:33:55.708 TRACE 1236 --- [lication Thread] org.hibernate.engine.spi.ActionQueue     : Adding resolved non-early insert action.
2020-03-07 18:33:55.711 TRACE 1236 --- [lication Thread] org.hibernate.engine.internal.Cascade    : Processing cascade ACTION_MERGE for: com.bcadaval.memefinder3020.modelo.beans.Imagen
2020-03-07 18:33:55.714 TRACE 1236 --- [lication Thread] org.hibernate.engine.internal.Cascade    : Cascade ACTION_MERGE for collection: com.bcadaval.memefinder3020.modelo.beans.Imagen.etiquetas
2020-03-07 18:33:55.714 TRACE 1236 --- [lication Thread] org.hibernate.engine.internal.Cascade    : Done cascade ACTION_MERGE for collection: com.bcadaval.memefinder3020.modelo.beans.Imagen.etiquetas
2020-03-07 18:33:55.714 TRACE 1236 --- [lication Thread] org.hibernate.engine.internal.Cascade    : Done processing cascade ACTION_MERGE for: com.bcadaval.memefinder3020.modelo.beans.Imagen
2020-03-07 18:33:55.715 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : Closing session [ac23f2c2-d709-4a5e-a206-68fe3e65bd51]
2020-03-07 18:33:55.715 TRACE 1236 --- [lication Thread] o.h.e.jdbc.internal.JdbcCoordinatorImpl  : Closing JDBC container [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@53fca5fc]
2020-03-07 18:33:55.715 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources
2020-03-07 18:33:55.715 TRACE 1236 --- [lication Thread] o.h.r.j.i.LogicalConnectionManagedImpl   : Closing logical connection
2020-03-07 18:33:55.715 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources
2020-03-07 18:33:55.715 TRACE 1236 --- [lication Thread] o.h.r.j.i.LogicalConnectionManagedImpl   : Logical connection closed
2020-03-07 18:33:55.720 DEBUG 1236 --- [lication Thread] o.h.e.t.internal.TransactionImpl         : committing
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#beforeCompletionCallback
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : SessionImpl#beforeTransactionCompletion()
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : Automatically flushing session
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] j.i.AbstractLogicalConnectionImplementor : Preparing to commit transaction via JDBC Connection.commit()
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] j.i.AbstractLogicalConnectionImplementor : Transaction committed via JDBC Connection.commit()
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] j.i.AbstractLogicalConnectionImplementor : LogicalConnection#afterTransaction
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] j.i.AbstractLogicalConnectionImplementor : re-enabling auto-commit on JDBC Connection after completion of JDBC-based transaction
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] cResourceLocalTransactionCoordinatorImpl : ResourceLocalTransactionCoordinatorImpl#afterCompletionCallback(true)
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] .t.i.SynchronizationRegistryStandardImpl : SynchronizationRegistryStandardImpl.notifySynchronizationsAfterTransactionCompletion(3)
2020-03-07 18:33:55.721 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : SessionImpl#afterTransactionCompletion(successful=true, delayed=false)
2020-03-07 18:33:55.722 TRACE 1236 --- [lication Thread] org.hibernate.internal.SessionImpl       : Closing session [1956899b-7cc9-4f6a-bb51-5b45abbfed69]
2020-03-07 18:33:55.722 TRACE 1236 --- [lication Thread] o.h.e.jdbc.internal.JdbcCoordinatorImpl  : Closing JDBC container [org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl@4ec81919]
2020-03-07 18:33:55.722 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources
2020-03-07 18:33:55.722 TRACE 1236 --- [lication Thread] o.h.r.j.i.LogicalConnectionManagedImpl   : Closing logical connection
2020-03-07 18:33:55.727 TRACE 1236 --- [lication Thread] o.h.r.j.i.ResourceRegistryStandardImpl   : Releasing JDBC resources
2020-03-07 18:33:55.727 TRACE 1236 --- [lication Thread] o.h.r.j.i.LogicalConnectionManagedImpl   : Logical connection closed

I also noticed that the query commited after the conection closing (timestamp 2020-03-07 18:33:55.720 for Ctrl+F), I don't know if it has anything to do with the persistence.

Niedon
  • 15
  • 1
  • 8

2 Answers2

0

This is because the transaction was not closed before you tried to fetch the data from database.

Try use saveAndFlush(); instead of save();

CodeSlave
  • 425
  • 6
  • 21
  • I tried it, but it throws an exception: `Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: no transaction is in progress; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress` – Niedon Mar 07 '20 at 18:05
  • Try also use `@Transactional` at your service. – CodeSlave Mar 07 '20 at 18:10
  • 1
    Annotating the service with `@Transactional` is a huge code smell – Andronicus Mar 07 '20 at 18:13
  • Same, I tried both `@Transactional` annotations (`javax` and `springframework`) and still throws the exception, even adding/removing `@EnableTransactionManagement` to the Spring config file. Log tells it rolled back after the exception, hopefully. – Niedon Mar 07 '20 at 18:18
  • @Andronicus no, it does fine, here are the log messages: `rolling back` - `Preparing to rollback transaction via JDBC Connection.rollback()` - `Transaction rolled-back via JDBC Connection.rollback()` - `LogicalConnection#afterTransaction` - `Releasing JDBC resources` - `re-enabling auto-commit on JDBC Connection after completion of JDBC-based transaction` – Niedon Mar 07 '20 at 18:31
  • method of the service* – CodeSlave Jun 04 '22 at 08:12
-1

I finally made it work, I don't know why, but I'm posting how I did it in case it helps someone.

My configutarion file looked like this:

@Configuration
@EnableTransactionManagement
public class SpringConfig {
    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");

        String ruta = System.getProperty("user.home") + "\\path\\to\\my\\db";
        String url = "jdbc:hsqldb:file:" + ruta;
        dataSource.setUrl(url);

        dataSource.setUsername("SA");
        dataSource.setPassword("");

        return dataSource;

    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("com.bcadaval.memefinder3020.modelo.beans");

        return sessionFactory;
    }



    @Bean
    public PlatformTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }


    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
          LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
          em.setDataSource(dataSource());
          em.setPackagesToScan("com.bcadaval.memefinder3020.modelo.beans");     
          JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
          em.setJpaVendorAdapter(vendorAdapter);
          return em;
       }
}

I made some changes:

@Configuration
@EnableTransactionManagement
public class SpringConfig {
    @Bean
    public DataSource dataSource() { /* the same as before */}

    @Bean
    public EntityManager entityManager() {
        return entityManagerFactory().createEntityManager();
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {

          LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
          em.setDataSource(dataSource());
          em.setPackagesToScan("com.bcadaval.memefinder3020.modelo.beans");     
          JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
          em.setJpaVendorAdapter(vendorAdapter);
          em.setPersistenceUnitName("default");
          em.afterPropertiesSet();
          return em.getObject();
       }
}

As CodeSlave said, I needed to flush(), and then I recieved that exception, but after deleting the LocalSessionFactoryBean bean all started working. I have tried even deleting EntityManager and EntityManagerFactory beans and it keeps working fine, but I don't know if I should keep them or delete them. I would like to give a more clear answer to this but I'm new in Hibernate, I guess I was unconsciously configuring a transaction manager that Hibernate/Spring wasn't going to use or something like that.

Niedon
  • 15
  • 1
  • 8