Skip to content

Commit 04fdf27

Browse files
committed
HHH-19708 disallow write operations in read-only session
1 parent 8796b47 commit 04fdf27

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

hibernate-core/src/main/java/org/hibernate/internal/AbstractSharedSessionContract.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,12 @@ boolean isReadOnly() {
298298
return readOnly;
299299
}
300300

301+
void checkNotReadOnly() {
302+
if ( isReadOnly() ) {
303+
throw new IllegalStateException( "Session is in read-only mode" );
304+
}
305+
}
306+
301307
private static SessionEventListenerManager createSessionEventsManager(
302308
SessionFactoryOptions factoryOptions, SessionCreationOptions options) {
303309
final var customListeners = options.getCustomSessionEventListener();
@@ -1403,7 +1409,7 @@ public ProcedureCall getNamedProcedureCall(String name) {
14031409
throw new IllegalArgumentException( "No named stored procedure call with given name '" + name + "'" );
14041410
}
14051411
@SuppressWarnings("UnnecessaryLocalVariable")
1406-
final ProcedureCall procedureCall = memento.makeProcedureCall( this );
1412+
final var procedureCall = memento.makeProcedureCall( this );
14071413
// procedureCall.setComment( "Named stored procedure call [" + name + "]" );
14081414
return procedureCall;
14091415
}

hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ private void managedFlush() {
479479
}
480480
else {
481481
log.trace( "Automatically flushing session" );
482-
doFlush();
482+
fireFlush();
483483
}
484484
}
485485

@@ -679,6 +679,7 @@ public void persist(String entityName, Object object, PersistContext copiedAlrea
679679
private void firePersist(final PersistEvent event) {
680680
Throwable originalException = null;
681681
try {
682+
checkNotReadOnly();
682683
checkTransactionSynchStatus();
683684
checkNoUnresolvedActionsBeforeOperation();
684685

@@ -785,6 +786,7 @@ public void merge(String entityName, Object object, MergeContext copiedAlready)
785786

786787
private Object fireMerge(MergeEvent event) {
787788
try {
789+
checkNotReadOnly();
788790
checkTransactionSynchStatus();
789791
checkNoUnresolvedActionsBeforeOperation();
790792
eventListenerGroups.eventListenerGroup_MERGE
@@ -880,6 +882,7 @@ private void logRemoveOrphanBeforeUpdates(String timing, String entityName, Obje
880882

881883
private void fireDelete(final DeleteEvent event) {
882884
try {
885+
checkNotReadOnly();
883886
pulseTransactionCoordinator();
884887
eventListenerGroups.eventListenerGroup_DELETE
885888
.fireEventOnEachListener( event, DeleteEventListener::onDelete );
@@ -1423,22 +1426,24 @@ public boolean isDirty() {
14231426
@Override
14241427
public void flush() {
14251428
checkOpen();
1426-
doFlush();
1429+
fireFlush();
14271430
}
14281431

1429-
private void doFlush() {
1430-
try {
1431-
pulseTransactionCoordinator();
1432-
checkTransactionNeededForUpdateOperation();
1433-
if ( persistenceContext.getCascadeLevel() > 0 ) {
1434-
throw new HibernateException( "Flush during cascade is dangerous" );
1432+
private void fireFlush() {
1433+
if ( !isReadOnly() ) {
1434+
try {
1435+
pulseTransactionCoordinator();
1436+
checkTransactionNeededForUpdateOperation();
1437+
if ( persistenceContext.getCascadeLevel() > 0 ) {
1438+
throw new HibernateException( "Flush during cascade is dangerous" );
1439+
}
1440+
eventListenerGroups.eventListenerGroup_FLUSH
1441+
.fireEventOnEachListener( new FlushEvent( this ), FlushEventListener::onFlush );
1442+
delayedAfterCompletion();
1443+
}
1444+
catch (RuntimeException e) {
1445+
throw getExceptionConverter().convert( e );
14351446
}
1436-
eventListenerGroups.eventListenerGroup_FLUSH
1437-
.fireEventOnEachListener( new FlushEvent( this ), FlushEventListener::onFlush );
1438-
delayedAfterCompletion();
1439-
}
1440-
catch ( RuntimeException e ) {
1441-
throw getExceptionConverter().convert( e );
14421447
}
14431448
}
14441449

@@ -1484,7 +1489,7 @@ public void forceFlush(EntityKey key) {
14841489
);
14851490
}
14861491
checkOpenOrWaitingForAutoClose();
1487-
doFlush();
1492+
fireFlush();
14881493
}
14891494

14901495
@Override @Deprecated

hibernate-core/src/main/java/org/hibernate/internal/StatelessSessionImpl.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ public void insertMultiple(List<?> entities) {
172172
@Override
173173
public Object insert(String entityName, Object entity) {
174174
checkOpen();
175+
checkNotReadOnly();
175176
final var persister = getEntityPersister( entityName, entity );
176177
final Object id;
177178
final Object[] state = persister.getValues( entity );
@@ -311,6 +312,7 @@ public void deleteMultiple(List<?> entities) {
311312
@Override
312313
public void delete(String entityName, Object entity) {
313314
checkOpen();
315+
checkNotReadOnly();
314316
final var persister = getEntityPersister( entityName, entity );
315317
final Object id = persister.getIdentifier( entity, this );
316318
final Object version = persister.getVersion( entity );
@@ -388,6 +390,7 @@ public void updateMultiple(List<?> entities) {
388390
@Override
389391
public void update(String entityName, Object entity) {
390392
checkOpen();
393+
checkNotReadOnly();
391394
final var persister = getEntityPersister( entityName, entity );
392395
final Object id = persister.getIdentifier( entity, this );
393396
final Object[] state = persister.getValues( entity );
@@ -474,6 +477,7 @@ public void upsertMultiple(List<?> entities) {
474477
@Override
475478
public void upsert(String entityName, Object entity) {
476479
checkOpen();
480+
checkNotReadOnly();
477481
final var persister = getEntityPersister( entityName, entity );
478482
final Object id = idToUpsert( entity, persister );
479483
final Object[] state = persister.getValues( entity );

0 commit comments

Comments
 (0)