-
Notifications
You must be signed in to change notification settings - Fork 0
Hibernate
Mathieu Lavigne edited this page Sep 24, 2025
·
9 revisions
Pour avoir :
| Table A | Table B |
|---|---|
| id | a_id |
A.java :
@Id
ID id;
@OneToOne
@PrimaryKeyJoinColumn
B b;B.java :
@Id
ID id;Pour configurer en snake_case avec Spring Data JPA >= 2.2.1 :
spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategyErreur :
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
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);
}
});# Pour logger les requêtes SQL
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE- 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 );
- SimpleJpaRepositorySpy : pour capturer les requêtes HQL