Skip to content

Hibernate

Mathieu Lavigne edited this page Sep 24, 2025 · 9 revisions

Join

Pour avoir :

Table A Table B
id a_id

A.java :

@Id
ID id;

@OneToOne
@PrimaryKeyJoinColumn
B b;

B.java :

@Id
ID id;

NamingStrategy

Pour configurer en snake_case avec Spring Data JPA >= 2.2.1 :

spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy

Source Source

Transaction silently rolled back (Spring)

Erreur :

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

Provoquée par la méthode org.springframework.transaction.interceptor.TransactionAspectSupport#commitTransactionAfterReturning dans laquelle on peut ajouter un point d'arrêt pour voir quelle méthode a créé la transaction.

Pour détecter à quel moment la transaction est marquée rollback-only ajouter un point d'arrêt sur la méthode org.hibernate.engine.transaction.internal.TransactionImpl#setRollbackOnly. source

Guide.

Une manière de corriger le problème est de créer un autre service/composant qui crée une nouvelle transaction isolée de la 1ère avec le code :

@Transactional(propagation = Propagation.REQUIRES_NEW)

On peut également créer une nouvelle transaction programmatiquement :

val transactionTemplate = new TransactionTemplate(platformTransactionManager);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
transactionTemplate.executeWithoutResult(status -> {
    try {
        // Code qui nécessite une nouvelle transaction
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
});

Source

Doc Spring

Logs

# Pour logger les requêtes SQL
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Source

Sources

  • Créateur de la requête SQL : hibernate-core-6.5.3.Final-sources.jar!/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java:130
  • Logs Hibernate: : hibernate-core-6.5.3.Final-sources.jar!/org/hibernate/engine/jdbc/internal/StatementPreparerImpl.java:174 : jdbcServices.getSqlStatementLogger().logStatement( sql );

Voir aussi

Clone this wiki locally