private void doIntegration( Map properties, JaccPermissionDeclarations permissionDeclarations, SessionFactoryServiceRegistry serviceRegistry) { boolean isSecurityEnabled = properties.containsKey( AvailableSettings.JACC_ENABLED ); if ( ! isSecurityEnabled ) { log.debug( "Skipping JACC integration as it was not enabled" ); return; } final String contextId = (String) properties.get( AvailableSettings.JACC_CONTEXT_ID ); if ( contextId == null ) { throw new IntegrationException( "JACC context id must be specified" ); } final JaccService jaccService = serviceRegistry.getService( JaccService.class ); if ( jaccService == null ) { throw new IntegrationException( "JaccService was not set up" ); } if ( permissionDeclarations != null ) { for ( GrantedPermission declaration : permissionDeclarations.getPermissionDeclarations() ) { jaccService.addPermission( declaration ); } } final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class ); eventListenerRegistry.addDuplicationStrategy( DUPLICATION_STRATEGY ); eventListenerRegistry.prependListeners( EventType.PRE_DELETE, new JaccPreDeleteEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_INSERT, new JaccPreInsertEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_UPDATE, new JaccPreUpdateEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_LOAD, new JaccPreLoadEventListener() ); }
private void integrate(SessionFactoryServiceRegistry serviceRegistry) { serviceRegistry.getService( EventListenerRegistry.class ).prependListeners( EventType.LOAD, new CustomLoadListener() ); }
eventListenerRegistry.addDuplicationStrategy( DUPLICATION_STRATEGY ); eventListenerRegistry.prependListeners( EventType.PRE_DELETE, new JaccPreDeleteEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_INSERT, new JaccPreInsertEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_UPDATE, new JaccPreUpdateEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_LOAD, new JaccPreLoadEventListener() );
@Test public void test() { EventListenerRegistry registry = sessionFactory().getServiceRegistry().getService( EventListenerRegistry.class ); registry.prependListeners( EventType.LOAD, new ImmediateLoadTrap() ); doInJPA( this::sessionFactory, em -> { em.find( Parent.class, parentID ); // unwanted lazy load occurs on flush } ); }
@Test(expected = SecurityException.class) public void testLoadListener() { Serializable customerId = 1L; doInJPA( this::entityManagerFactory, entityManager -> { //tag::events-interceptors-load-listener-example[] EntityManagerFactory entityManagerFactory = entityManagerFactory(); SessionFactoryImplementor sessionFactory = entityManagerFactory.unwrap( SessionFactoryImplementor.class ); sessionFactory .getServiceRegistry() .getService( EventListenerRegistry.class ) .prependListeners( EventType.LOAD, new SecuredLoadEntityListener() ); Customer customer = entityManager.find( Customer.class, customerId ); //end::events-interceptors-load-listener-example[] } ); }
@Override public void integrate( Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { // As you might expect, an EventListenerRegistry is the thing with which event // listeners are registered // It is a service so we look it up using the service registry final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class ); // If you wish to have custom determination and handling of "duplicate" listeners, // you would have to add an implementation of the // org.hibernate.event.service.spi.DuplicationStrategy contract like this eventListenerRegistry.addDuplicationStrategy( new CustomDuplicationStrategy() ); // EventListenerRegistry defines 3 ways to register listeners: // 1) This form overrides any existing registrations with eventListenerRegistry.setListeners( EventType.AUTO_FLUSH, DefaultAutoFlushEventListener.class ); // 2) This form adds the specified listener(s) to the beginning of the listener chain eventListenerRegistry.prependListeners( EventType.PERSIST, DefaultPersistEventListener.class ); // 3) This form adds the specified listener(s) to the end of the listener chain eventListenerRegistry.appendListeners( EventType.MERGE, DefaultMergeEventListener.class ); }
eventListenerRegistry.prependListeners(EventType.SAVE_UPDATE, SaveOrUpdateListener.class); eventListenerRegistry.prependListeners(EventType.POST_LOAD, PostLoadListener.class); eventListenerRegistry.prependListeners(EventType.MERGE, MergeListener.class);
private void doIntegration( Map properties, JaccPermissionDeclarations permissionDeclarations, SessionFactoryServiceRegistry serviceRegistry) { boolean isSecurityEnabled = properties.containsKey( AvailableSettings.JACC_ENABLED ); if ( ! isSecurityEnabled ) { log.debug( "Skipping JACC integration as it was not enabled" ); return; } final String contextId = (String) properties.get( AvailableSettings.JACC_CONTEXT_ID ); if ( contextId == null ) { throw new IntegrationException( "JACC context id must be specified" ); } final JaccService jaccService = serviceRegistry.getService( JaccService.class ); if ( jaccService == null ) { throw new IntegrationException( "JaccService was not set up" ); } if ( permissionDeclarations != null ) { for ( GrantedPermission declaration : permissionDeclarations.getPermissionDeclarations() ) { jaccService.addPermission( declaration ); } } final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class ); eventListenerRegistry.addDuplicationStrategy( DUPLICATION_STRATEGY ); eventListenerRegistry.prependListeners( EventType.PRE_DELETE, new JaccPreDeleteEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_INSERT, new JaccPreInsertEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_UPDATE, new JaccPreUpdateEventListener() ); eventListenerRegistry.prependListeners( EventType.PRE_LOAD, new JaccPreLoadEventListener() ); }
public class MyIntegrator implements org.hibernate.integrator.spi.Integrator { public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { // As you might expect, an EventListenerRegistry is the thing with which event listeners are registered // It is a service so we look it up using the service registry final EventListenerRegistry eventListenerRegistry = serviceRegistry.getService( EventListenerRegistry.class ); // If you wish to have custom determination and handling of "duplicate" listeners, you would have to add an // implementation of the org.hibernate.event.service.spi.DuplicationStrategy contract like this eventListenerRegistry.addDuplicationStrategy( myDuplicationStrategy ); // EventListenerRegistry defines 3 ways to register listeners: // 1) This form overrides any existing registrations with eventListenerRegistry.setListeners( EventType.AUTO_FLUSH, myCompleteSetOfListeners ); // 2) This form adds the specified listener(s) to the beginning of the listener chain eventListenerRegistry.prependListeners( EventType.AUTO_FLUSH, myListenersToBeCalledFirst ); // 3) This form adds the specified listener(s) to the end of the listener chain eventListenerRegistry.appendListeners( EventType.AUTO_FLUSH, myListenersToBeCalledLast ); } }
eventListenerRegistry.prependListeners( EventType.PRE_DELETE, new JACCPreDeleteEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.PRE_INSERT, new JACCPreInsertEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.PRE_UPDATE, new JACCPreUpdateEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.PRE_LOAD, new JACCPreLoadEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.POST_DELETE, new EJB3PostDeleteEventListener() ); eventListenerRegistry.prependListeners( EventType.POST_INSERT, new EJB3PostInsertEventListener() ); eventListenerRegistry.prependListeners( EventType.POST_LOAD, new EJB3PostLoadEventListener() ); eventListenerRegistry.prependListeners( EventType.POST_UPDATE, new EJB3PostUpdateEventListener() );
eventListenerRegistry.prependListeners( EventType.PRE_DELETE, new JACCPreDeleteEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.PRE_INSERT, new JACCPreInsertEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.PRE_UPDATE, new JACCPreUpdateEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.PRE_LOAD, new JACCPreLoadEventListener(jaccContextId) ); eventListenerRegistry.prependListeners( EventType.POST_DELETE, new EJB3PostDeleteEventListener() ); eventListenerRegistry.prependListeners( EventType.POST_INSERT, new EJB3PostInsertEventListener() ); eventListenerRegistry.prependListeners( EventType.POST_LOAD, new EJB3PostLoadEventListener() ); eventListenerRegistry.prependListeners( EventType.POST_UPDATE, new EJB3PostUpdateEventListener() );
@Test public void test() { doInJPA(entityManager -> { Post post1 = new Post(); post1.setId(1L); post1.setTitle("High-Performance Java Persistence"); entityManager.persist(post1); Post post2 = new Post(); post2.setId(2L); post2.setTitle("High-Performance Java Persistence"); entityManager.persist(post2); }); doInJPA(entityManager -> { Post post = entityManager.find(Post.class, 1L); LOGGER.info("Fetched post: {}", post); post.setScore(12); SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) entityManager.unwrap( Session.class ).getSessionFactory(); sessionFactory.getServiceRegistry() .getService( EventListenerRegistry.class ) .prependListeners( EventType.FLUSH_ENTITY, new HydratedStateFlushEntityEventListener() ); entityManager.flush(); Post post2 = entityManager.find(Post.class, 2L); LOGGER.info("Fetched post: {}", post2); post2.setTitle("HPJP"); }); }
public SessionFactory newSessionFactory(Configuration effectiveHibernateConfiguration) { SessionFactory hibernateSessionFactory = TopiaUtil.newSessionFactory(effectiveHibernateConfiguration); EventListenerRegistry eventListenerRegistry = getHibernateService(hibernateSessionFactory, EventListenerRegistry.class); TopiaHibernateEventListener listener = new TopiaHibernateEventListener(sessionRegistry); eventListenerRegistry.appendListeners(EventType.PRE_INSERT, listener); eventListenerRegistry.appendListeners(EventType.PRE_LOAD, listener); eventListenerRegistry.appendListeners(EventType.PRE_UPDATE, listener); eventListenerRegistry.appendListeners(EventType.PRE_DELETE, listener); eventListenerRegistry.appendListeners(EventType.POST_INSERT, listener); eventListenerRegistry.appendListeners(EventType.POST_LOAD, listener); eventListenerRegistry.appendListeners(EventType.POST_UPDATE, listener); eventListenerRegistry.appendListeners(EventType.POST_DELETE, listener); // following listeners must be called before hibernate eventListenerRegistry.prependListeners(EventType.SAVE_UPDATE, listener); return hibernateSessionFactory; }
public SessionFactory getSessionFactory() { if (hibernateSessionFactory == null) { Configuration effectiveHibernateConfiguration = getHibernateConfiguration(); hibernateSessionFactory = TopiaUtil.newSessionFactory(effectiveHibernateConfiguration); EventListenerRegistry eventListenerRegistry = getHibernateService(hibernateSessionFactory, EventListenerRegistry.class); TopiaHibernateEventListener listener = new TopiaHibernateEventListener(sessionRegistry); eventListenerRegistry.appendListeners(EventType.PRE_INSERT, listener); eventListenerRegistry.appendListeners(EventType.PRE_LOAD, listener); eventListenerRegistry.appendListeners(EventType.PRE_UPDATE, listener); eventListenerRegistry.appendListeners(EventType.PRE_DELETE, listener); eventListenerRegistry.appendListeners(EventType.POST_INSERT, listener); eventListenerRegistry.appendListeners(EventType.POST_LOAD, listener); eventListenerRegistry.appendListeners(EventType.POST_UPDATE, listener); eventListenerRegistry.appendListeners(EventType.POST_DELETE, listener); // following listeners must be called before hibernate eventListenerRegistry.prependListeners(EventType.SAVE_UPDATE, listener); } return hibernateSessionFactory; }