HHH-11143 : Log a warning if @Cache / @Cacheable specified on non-root entities
This commit is contained in:
parent
31fbdbb0f0
commit
db885b85bb
|
@ -12,6 +12,7 @@ import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import javax.persistence.Access;
|
import javax.persistence.Access;
|
||||||
|
import javax.persistence.Cacheable;
|
||||||
import javax.persistence.ConstraintMode;
|
import javax.persistence.ConstraintMode;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.InheritanceType;
|
import javax.persistence.InheritanceType;
|
||||||
|
@ -302,6 +303,10 @@ public class EntityBinder {
|
||||||
if (annotatedClass.isAnnotationPresent(Immutable.class)) {
|
if (annotatedClass.isAnnotationPresent(Immutable.class)) {
|
||||||
LOG.immutableAnnotationOnNonRoot(annotatedClass.getName());
|
LOG.immutableAnnotationOnNonRoot(annotatedClass.getName());
|
||||||
}
|
}
|
||||||
|
if ( annotatedClass.isAnnotationPresent( Cacheable.class ) ||
|
||||||
|
annotatedClass.isAnnotationPresent( Cache.class ) ) {
|
||||||
|
LOG.cacheOrCacheableAnnotationOnNonRoot( annotatedClass.getName() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
persistentClass.setOptimisticLockStyle( getVersioning( optimisticLockType ) );
|
persistentClass.setOptimisticLockStyle( getVersioning( optimisticLockType ) );
|
||||||
persistentClass.setSelectBeforeUpdate( selectBeforeUpdate );
|
persistentClass.setSelectBeforeUpdate( selectBeforeUpdate );
|
||||||
|
|
|
@ -1766,4 +1766,8 @@ public interface CoreMessageLogger extends BasicLogger {
|
||||||
"implementing equals/hashCode."
|
"implementing equals/hashCode."
|
||||||
)
|
)
|
||||||
void unknownJavaTypeNoEqualsHashCode(Class javaType);
|
void unknownJavaTypeNoEqualsHashCode(Class javaType);
|
||||||
|
|
||||||
|
@LogMessage(level = WARN)
|
||||||
|
@Message(value = "@javax.persistence.Cacheable or @org.hibernate.annotations.Cache used on a non-root entity: ignored for %s", id = 482)
|
||||||
|
void cacheOrCacheableAnnotationOnNonRoot(String className);
|
||||||
}
|
}
|
||||||
|
|
85
hibernate-core/src/test/java/org/hibernate/test/cache/NonRootEntityWithCacheAnnotationTest.java
vendored
Normal file
85
hibernate-core/src/test/java/org/hibernate/test/cache/NonRootEntityWithCacheAnnotationTest.java
vendored
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* 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.test.cache;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Inheritance;
|
||||||
|
import javax.persistence.SharedCacheMode;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.Cache;
|
||||||
|
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||||
|
import org.hibernate.boot.Metadata;
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.cfg.annotations.EntityBinder;
|
||||||
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.cache.CachingRegionFactory;
|
||||||
|
import org.hibernate.testing.logger.LoggerInspectionRule;
|
||||||
|
import org.hibernate.testing.logger.Triggerable;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
@TestForIssue( jiraKey = "HHH-11143")
|
||||||
|
public class NonRootEntityWithCacheAnnotationTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public LoggerInspectionRule logInspection = new LoggerInspectionRule(
|
||||||
|
Logger.getMessageLogger( CoreMessageLogger.class, EntityBinder.class.getName() )
|
||||||
|
);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCacheOnNonRootEntity() {
|
||||||
|
Map settings = new HashMap();
|
||||||
|
settings.put( Environment.CACHE_REGION_FACTORY, CachingRegionFactory.class.getName() );
|
||||||
|
settings.put( AvailableSettings.JPA_SHARED_CACHE_MODE, SharedCacheMode.ENABLE_SELECTIVE );
|
||||||
|
|
||||||
|
ServiceRegistryImplementor serviceRegistry = (ServiceRegistryImplementor) new StandardServiceRegistryBuilder()
|
||||||
|
.applySettings( settings )
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Triggerable triggerable = logInspection.watchForLogMessages( "HHH000482" );
|
||||||
|
|
||||||
|
Metadata metadata = new MetadataSources( serviceRegistry )
|
||||||
|
.addAnnotatedClass( ABase.class )
|
||||||
|
.addAnnotatedClass( AEntity.class )
|
||||||
|
.buildMetadata();
|
||||||
|
|
||||||
|
assertTrue( triggerable.wasTriggered() );
|
||||||
|
assertNull( ( metadata.getEntityBinding( AEntity.class.getName() ) ).getCacheConcurrencyStrategy() );
|
||||||
|
|
||||||
|
serviceRegistry.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Inheritance
|
||||||
|
public static class ABase {
|
||||||
|
@Id
|
||||||
|
private Long id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||||
|
public static class AEntity extends ABase {
|
||||||
|
private String name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* 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.test.cache;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.persistence.Cacheable;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Inheritance;
|
||||||
|
import javax.persistence.SharedCacheMode;
|
||||||
|
|
||||||
|
import org.hibernate.boot.Metadata;
|
||||||
|
import org.hibernate.boot.MetadataSources;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.cfg.annotations.EntityBinder;
|
||||||
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
|
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.cache.CachingRegionFactory;
|
||||||
|
import org.hibernate.testing.logger.LoggerInspectionRule;
|
||||||
|
import org.hibernate.testing.logger.Triggerable;
|
||||||
|
import org.junit.Rule;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.jboss.logging.Logger;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner
|
||||||
|
*/
|
||||||
|
@TestForIssue( jiraKey = "HHH-11143")
|
||||||
|
public class NonRootEntityWithCacheableAnnotationTest {
|
||||||
|
|
||||||
|
@Rule
|
||||||
|
public LoggerInspectionRule logInspection = new LoggerInspectionRule(
|
||||||
|
Logger.getMessageLogger( CoreMessageLogger.class, EntityBinder.class.getName() )
|
||||||
|
);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCacheableOnNonRootEntity() {
|
||||||
|
Map settings = new HashMap();
|
||||||
|
settings.put( Environment.CACHE_REGION_FACTORY, CachingRegionFactory.class.getName() );
|
||||||
|
settings.put( AvailableSettings.DEFAULT_CACHE_CONCURRENCY_STRATEGY, "read-write" );
|
||||||
|
settings.put( AvailableSettings.JPA_SHARED_CACHE_MODE, SharedCacheMode.ENABLE_SELECTIVE );
|
||||||
|
|
||||||
|
ServiceRegistryImplementor serviceRegistry = (ServiceRegistryImplementor) new StandardServiceRegistryBuilder()
|
||||||
|
.applySettings( settings )
|
||||||
|
.build();
|
||||||
|
|
||||||
|
Triggerable triggerable = logInspection.watchForLogMessages( "HHH000482" );
|
||||||
|
|
||||||
|
Metadata metadata = new MetadataSources( serviceRegistry )
|
||||||
|
.addAnnotatedClass( ABase.class )
|
||||||
|
.addAnnotatedClass( AEntity.class )
|
||||||
|
.buildMetadata();
|
||||||
|
|
||||||
|
assertTrue( triggerable.wasTriggered() );
|
||||||
|
assertNull( ( metadata.getEntityBinding( AEntity.class.getName() ) ).getCacheConcurrencyStrategy() );
|
||||||
|
|
||||||
|
serviceRegistry.destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Inheritance
|
||||||
|
public static class ABase {
|
||||||
|
@Id
|
||||||
|
private Long id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Cacheable
|
||||||
|
public static class AEntity extends ABase {
|
||||||
|
private String name;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue