From d46d3d66a28382f4212f68d453dc7d4d87ec1a43 Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Mon, 30 Sep 2019 07:58:18 -0500 Subject: [PATCH 1/2] HHH-13432 - EntityManagerFactory no longer exposes "javax.persistence.nonJtaDataSource" --- .../orm/test/bootstrap/DataSourceStub.java | 88 +++++++++++++++++++ .../bootstrap/PersistenceUnitInfoTests.java | 54 ++++++++++++ .../PersistenceUnitOverridesTests.java | 85 ++---------------- 3 files changed, 149 insertions(+), 78 deletions(-) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/DataSourceStub.java create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitInfoTests.java diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/DataSourceStub.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/DataSourceStub.java new file mode 100644 index 0000000000..708c963113 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/DataSourceStub.java @@ -0,0 +1,88 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.bootstrap; + +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.logging.Logger; +import javax.sql.DataSource; + +import org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl; + +import org.hibernate.testing.env.ConnectionProviderBuilder; + +/** + * @author Steve Ebersole + */ +public class DataSourceStub implements DataSource { + private final String id; + private final DriverManagerConnectionProviderImpl connectionProvider; + private PrintWriter printWriter; + + DataSourceStub(String id) { + this.id = id; + connectionProvider = new DriverManagerConnectionProviderImpl(); + connectionProvider.configure( ConnectionProviderBuilder.getConnectionProviderProperties() ); + + printWriter = null; + } + + public String getId() { + return id; + } + + @Override + public Connection getConnection() throws SQLException { + return connectionProvider.getConnection(); + } + + @Override + public Connection getConnection(String username, String password) { + throw new UnsupportedOperationException(); + } + + @Override + public PrintWriter getLogWriter() { + return printWriter; + } + + @Override + public void setLogWriter(PrintWriter out) { + this.printWriter = out; + } + + @Override + public void setLoginTimeout(int seconds) { + } + + @Override + public int getLoginTimeout() { + return -1; + } + + @Override + public Logger getParentLogger() { + return Logger.getGlobal(); + } + + @Override + public T unwrap(Class iface) { + //noinspection unchecked + return (T) this; + } + + @Override + public boolean isWrapperFor(Class iface) { + return iface.isAssignableFrom( getClass() ); + } + + @Override + public String toString() { + return "DataSourceImpl(" + id + ")"; + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitInfoTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitInfoTests.java new file mode 100644 index 0000000000..3fe098bdb7 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitInfoTests.java @@ -0,0 +1,54 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.orm.test.bootstrap; + +import java.util.Collections; +import java.util.Map; +import javax.persistence.EntityManagerFactory; +import javax.persistence.spi.PersistenceProvider; +import javax.sql.DataSource; + +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.jpa.HibernatePersistenceProvider; + +import org.hibernate.testing.FailureExpected; +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseUnitTestCase; +import org.hibernate.testing.util.jpa.PersistenceUnitInfoAdapter; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * @author Steve Ebersole + */ +public class PersistenceUnitInfoTests extends BaseUnitTestCase { + @Test + @TestForIssue( jiraKey = "HHH-13432" ) + @FailureExpected( jiraKey = "HHH-13432" ) + public void testJtaDataExposedAsProperty() { + final DataSource puDataSource = new DataSourceStub( "puDataSource" ); + final PersistenceUnitInfoAdapter info = new PersistenceUnitInfoAdapter() { + + @Override + public DataSource getNonJtaDataSource() { + return puDataSource; + } + }; + + final PersistenceProvider provider = new HibernatePersistenceProvider(); + + final EntityManagerFactory emf = provider.createContainerEntityManagerFactory( + info, + Collections.emptyMap() + ); + + final Map properties = emf.getProperties(); + final Object o = properties.get( AvailableSettings.JPA_JTA_DATASOURCE ); + assertEquals( o, puDataSource ); + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitOverridesTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitOverridesTests.java index 41e45d1fa3..6cc59d058f 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitOverridesTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/PersistenceUnitOverridesTests.java @@ -6,13 +6,9 @@ */ package org.hibernate.orm.test.bootstrap; -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.Properties; -import java.util.logging.Logger; import javax.persistence.EntityManagerFactory; import javax.persistence.spi.PersistenceProvider; import javax.persistence.spi.PersistenceUnitInfo; @@ -100,7 +96,7 @@ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitI final Properties puProperties; { - puDataSource = new DataSourceImpl( "puDataSource" ); + puDataSource = new DataSourceStub( "puDataSource" ); puProperties = new Properties(); puProperties.putAll( info.getProperties() ); @@ -161,7 +157,7 @@ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitI final DataSource puDataSource; { - puDataSource = new DataSourceImpl( "puDataSource" ); + puDataSource = new DataSourceStub( "puDataSource" ); } @Override @@ -209,8 +205,8 @@ public DataSource getJtaDataSource() { "have precedence over integration settings, which is also incorrect" ) public void testPassingIntegrationJpaDataSourceOverrideForJtaDataSourceElement() { - final DataSource puDataSource = new DataSourceImpl( "puDataSource" ); - final DataSource integrationDataSource = new DataSourceImpl( "integrationDataSource" ); + final DataSource puDataSource = new DataSourceStub( "puDataSource" ); + final DataSource integrationDataSource = new DataSourceStub( "integrationDataSource" ); PersistenceProvider provider = new HibernatePersistenceProvider() { @Override @@ -263,7 +259,7 @@ public DataSource getJtaDataSource() { public void testIntegrationOverridesOfPersistenceXmlDataSource() { // mimics a DataSource defined in the persistence.xml - final DataSourceImpl dataSource = new DataSourceImpl( "puDataSource" ); + final DataSourceStub dataSource = new DataSourceStub( "puDataSource" ); final PersistenceUnitInfoAdapter info = new PersistenceUnitInfoAdapter() { @Override @@ -274,7 +270,7 @@ public DataSource getNonJtaDataSource() { // Now create "integration Map" that overrides the DataSource to use - final DataSource override = new DataSourceImpl( "integrationDataSource" ); + final DataSource override = new DataSourceStub( "integrationDataSource" ); final Map integrationSettings = new HashMap<>(); integrationSettings.put( AvailableSettings.JPA_NON_JTA_DATASOURCE, override ); @@ -308,7 +304,7 @@ public DataSource getNonJtaDataSource() { public void testIntegrationOverridesOfPersistenceXmlDataSourceWithDriverManagerInfo() { // mimics a DataSource defined in the persistence.xml - final DataSourceImpl dataSource = new DataSourceImpl( "puDataSource" ); + final DataSourceStub dataSource = new DataSourceStub( "puDataSource" ); final PersistenceUnitInfoAdapter info = new PersistenceUnitInfoAdapter() { @Override @@ -335,71 +331,4 @@ public DataSource getNonJtaDataSource() { assertThat( connectionProvider, instanceOf( DriverManagerConnectionProviderImpl.class ) ); } - private static class DataSourceImpl implements DataSource { - private final String id; - private final DriverManagerConnectionProviderImpl connectionProvider; - private PrintWriter printWriter; - - DataSourceImpl(String id) { - this.id = id; - connectionProvider = new DriverManagerConnectionProviderImpl(); - connectionProvider.configure( ConnectionProviderBuilder.getConnectionProviderProperties() ); - - printWriter = null; - } - - public String getId() { - return id; - } - - @Override - public Connection getConnection() throws SQLException { - return connectionProvider.getConnection(); - } - - @Override - public Connection getConnection(String username, String password) { - throw new UnsupportedOperationException(); - } - - @Override - public PrintWriter getLogWriter() { - return printWriter; - } - - @Override - public void setLogWriter(PrintWriter out) { - this.printWriter = out; - } - - @Override - public void setLoginTimeout(int seconds) { - } - - @Override - public int getLoginTimeout() { - return -1; - } - - @Override - public Logger getParentLogger() { - return Logger.getGlobal(); - } - - @Override - public T unwrap(Class iface) { - //noinspection unchecked - return (T) this; - } - - @Override - public boolean isWrapperFor(Class iface) { - return iface.isAssignableFrom( getClass() ); - } - - @Override - public String toString() { - return "DataSourceImpl(" + id + ")"; - } - } } From ee304305e8005e479164c92edd01b55a0296df3d Mon Sep 17 00:00:00 2001 From: Steve Ebersole Date: Mon, 30 Sep 2019 17:50:39 -0500 Subject: [PATCH 2/2] HHH-13640 - Uninitialized HibernateProxy mapped as NO_PROXY gets initialized when reloaded with enhancement-as-proxy enabled --- .../internal/DefaultLoadEventListener.java | 16 ++++++++-------- .../java/org/hibernate/event/spi/LoadEvent.java | 17 ----------------- .../org/hibernate/internal/SessionImpl.java | 3 --- .../LazyToOnesProxyWithSubclassesTest.java | 3 --- 4 files changed, 8 insertions(+), 31 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java index 432b8650db..7b33d86f83 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java +++ b/hibernate-core/src/main/java/org/hibernate/event/internal/DefaultLoadEventListener.java @@ -287,21 +287,21 @@ private Object proxyOrLoad( LazyInitializer li = ( (HibernateProxy) proxy ).getHibernateLazyInitializer(); - if ( li.isUnwrap() || event.getShouldUnwrapProxy() ) { - return li.getImplementation(); + if ( li.isUnwrap() ) { + if ( entityMetamodel.hasSubclasses() ) { + LOG.debug( "Ignoring NO_PROXY for to-one association with subclasses to honor laziness" ); + } + else { + return li.getImplementation(); + } } - return persistenceContext.narrowProxy( proxy, persister, keyToLoad, null ); } // specialized handling for entities with subclasses with a HibernateProxy factory if ( entityMetamodel.hasSubclasses() ) { - // entities with subclasses that define a ProxyFactory can create - // a HibernateProxy so long as NO_PROXY was not specified. - if ( event.getShouldUnwrapProxy() != null && event.getShouldUnwrapProxy() ) { - LOG.debug( "Ignoring NO_PROXY for to-one association with subclasses to honor laziness" ); - } + // entities with subclasses that define a ProxyFactory can create a HibernateProxy return createProxy( event, persister, keyToLoad, persistenceContext ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/event/spi/LoadEvent.java b/hibernate-core/src/main/java/org/hibernate/event/spi/LoadEvent.java index b04c0b0818..bd33e60824 100644 --- a/hibernate-core/src/main/java/org/hibernate/event/spi/LoadEvent.java +++ b/hibernate-core/src/main/java/org/hibernate/event/spi/LoadEvent.java @@ -47,8 +47,6 @@ public LockOptions setScope(boolean scope) { private Object result; private PostLoadEvent postLoadEvent; - private Boolean shouldUnwrapProxy; - public LoadEvent(Serializable entityId, Object instanceToLoad, EventSource source) { this( entityId, null, instanceToLoad, DEFAULT_LOCK_OPTIONS, false, source ); } @@ -192,19 +190,4 @@ public PostLoadEvent getPostLoadEvent() { public void setPostLoadEvent(PostLoadEvent postLoadEvent) { this.postLoadEvent = postLoadEvent; } - - public Boolean getShouldUnwrapProxy() { - if ( shouldUnwrapProxy == null ) { - final boolean enabled = getSession().getFactory() - .getSessionFactoryOptions() - .isEnhancementAsProxyEnabled(); - return enabled; - } - - return shouldUnwrapProxy; - } - - public void setShouldUnwrapProxy(Boolean shouldUnwrapProxy) { - this.shouldUnwrapProxy = shouldUnwrapProxy; - } } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java index 656feaa482..534ba2f9df 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionImpl.java @@ -36,7 +36,6 @@ import javax.persistence.FlushModeType; import javax.persistence.LockModeType; import javax.persistence.PersistenceException; -import javax.persistence.PessimisticLockScope; import javax.persistence.StoredProcedureQuery; import javax.persistence.TransactionRequiredException; import javax.persistence.criteria.CriteriaBuilder; @@ -1041,7 +1040,6 @@ public final Object internalLoad( loadEvent = null; event = recycleEventInstance( event, id, entityName ); - event.setShouldUnwrapProxy( unwrapProxy ); fireLoadNoChecks( event, type ); @@ -1081,7 +1079,6 @@ private LoadEvent recycleEventInstance(final LoadEvent event, final Serializable event.setLockMode( LoadEvent.DEFAULT_LOCK_MODE ); event.setLockScope( LoadEvent.DEFAULT_LOCK_OPTIONS.getScope() ); event.setLockTimeout( LoadEvent.DEFAULT_LOCK_OPTIONS.getTimeOut() ); - event.setShouldUnwrapProxy( null ); return event; } } diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazy/proxy/LazyToOnesProxyWithSubclassesTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazy/proxy/LazyToOnesProxyWithSubclassesTest.java index 7c5d106ca1..8ff06a1cc6 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazy/proxy/LazyToOnesProxyWithSubclassesTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/lazy/proxy/LazyToOnesProxyWithSubclassesTest.java @@ -22,7 +22,6 @@ import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.testing.FailureExpected; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner; import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; @@ -63,7 +62,6 @@ protected void applyMetadataSources(MetadataSources sources) { } @Test - @FailureExpected( jiraKey = "HHH-13640") public void testNewProxyAssociation() { inTransaction( session -> { @@ -87,7 +85,6 @@ public void testNewProxyAssociation() { } @Test - @FailureExpected( jiraKey = "HHH-13640") public void testReusedProxyAssociation() { inTransaction( session -> {