1414import org .hibernate .boot .internal .ClassLoaderAccessImpl ;
1515import org .hibernate .boot .registry .classloading .spi .ClassLoaderService ;
1616import org .hibernate .engine .spi .SessionFactoryImplementor ;
17+ import org .hibernate .engine .spi .SharedSessionContractImplementor ;
1718import org .hibernate .event .spi .PreCollectionUpdateEvent ;
1819import org .hibernate .event .spi .PreCollectionUpdateEventListener ;
1920import org .hibernate .event .spi .PreDeleteEvent ;
@@ -59,8 +60,9 @@ public class BeanValidationEventListener
5960 private Validator validator ;
6061 private GroupsPerOperation groupsPerOperation ;
6162
62- public BeanValidationEventListener (
63- ValidatorFactory factory , Map <String , Object > settings , ClassLoaderService classLoaderService ) {
63+ private SessionFactoryImplementor sessionFactory ;
64+
65+ public BeanValidationEventListener (ValidatorFactory factory , Map <String , Object > settings , ClassLoaderService classLoaderService ) {
6466 traversableResolver = new HibernateTraversableResolver ();
6567 validator = factory .usingContext ()
6668 .traversableResolver ( traversableResolver )
@@ -70,17 +72,15 @@ public BeanValidationEventListener(
7072
7173 @ Override
7274 public void sessionFactoryCreated (SessionFactory factory ) {
73- SessionFactoryImplementor implementor = factory .unwrap ( SessionFactoryImplementor .class );
74- implementor
75- .getMappingMetamodel ()
76- .forEachEntityDescriptor ( entityPersister -> traversableResolver .addPersister ( entityPersister , implementor ) );
75+ sessionFactory = factory .unwrap ( SessionFactoryImplementor .class );
76+ sessionFactory .getMappingMetamodel ()
77+ .forEachEntityDescriptor ( entityPersister -> traversableResolver .addPersister ( entityPersister , sessionFactory ) );
7778 }
7879
7980 public boolean onPreInsert (PreInsertEvent event ) {
8081 validate (
8182 event .getEntity (),
8283 event .getPersister (),
83- event .getFactory (),
8484 GroupsPerOperation .Operation .INSERT
8585 );
8686 return false ;
@@ -90,7 +90,6 @@ public boolean onPreUpdate(PreUpdateEvent event) {
9090 validate (
9191 event .getEntity (),
9292 event .getPersister (),
93- event .getFactory (),
9493 GroupsPerOperation .Operation .UPDATE
9594 );
9695 return false ;
@@ -100,7 +99,6 @@ public boolean onPreDelete(PreDeleteEvent event) {
10099 validate (
101100 event .getEntity (),
102101 event .getPersister (),
103- event .getFactory (),
104102 GroupsPerOperation .Operation .DELETE
105103 );
106104 return false ;
@@ -111,7 +109,6 @@ public boolean onPreUpsert(PreUpsertEvent event) {
111109 validate (
112110 event .getEntity (),
113111 event .getPersister (),
114- event .getFactory (),
115112 GroupsPerOperation .Operation .UPSERT
116113 );
117114 return false ;
@@ -122,16 +119,24 @@ public void onPreUpdateCollection(PreCollectionUpdateEvent event) {
122119 final Object entity = castNonNull ( event .getCollection ().getOwner () );
123120 validate (
124121 entity ,
125- event .getSession ().getEntityPersister ( event .getAffectedOwnerEntityName (), entity ),
126- event .getFactory (),
122+ getEntityPersister ( event .getSession (), event .getAffectedOwnerEntityName (), entity ),
127123 GroupsPerOperation .Operation .UPDATE
128124 );
129125 }
130126
127+ private EntityPersister getEntityPersister (SharedSessionContractImplementor session , String entityName , Object entity ) {
128+ if ( session != null ) {
129+ return session .getEntityPersister ( entityName , entity );
130+ }
131+ return entityName == null
132+ ? sessionFactory .getMappingMetamodel ().getEntityDescriptor ( entity .getClass ().getName () )
133+ : sessionFactory .getMappingMetamodel ().getEntityDescriptor ( entityName )
134+ .getSubclassEntityPersister ( entity , sessionFactory );
135+ }
136+
131137 private <T > void validate (
132138 T object ,
133139 EntityPersister persister ,
134- SessionFactoryImplementor sessionFactory ,
135140 GroupsPerOperation .Operation operation ) {
136141 if ( object == null || persister .getRepresentationStrategy ().getMode () != RepresentationMode .POJO ) {
137142 return ;
0 commit comments