parent
e12ede311c
commit
9f3b1cfb5b
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* 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.jpa.test.metamodel;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.EmbeddedId;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.metamodel.EmbeddableType;
|
||||||
|
import javax.persistence.metamodel.EntityType;
|
||||||
|
import javax.persistence.metamodel.Metamodel;
|
||||||
|
|
||||||
|
import org.hibernate.cfg.AvailableSettings;
|
||||||
|
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-12871")
|
||||||
|
public abstract class AbstractJpaMetamodelPopulationTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
|
@Entity(name = "SimpleAnnotatedEntity")
|
||||||
|
public static class SimpleAnnotatedEntity {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
private Integer id;
|
||||||
|
private String data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity(name = "CompositeIdAnnotatedEntity")
|
||||||
|
public static class CompositeIdAnnotatedEntity {
|
||||||
|
@EmbeddedId
|
||||||
|
private CompositeIdId id;
|
||||||
|
private String data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public static class CompositeIdId implements Serializable {
|
||||||
|
private Integer id1;
|
||||||
|
private Integer id2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String[] getMappings() {
|
||||||
|
return new String[] {
|
||||||
|
"org/hibernate/jpa/test/metamodel/SimpleEntity.hbm.xml",
|
||||||
|
"org/hibernate/jpa/test/metamodel/CompositeIdEntity.hbm.xml",
|
||||||
|
"org/hibernate/jpa/test/metamodel/CompositeId2Entity.hbm.xml"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?>[] getAnnotatedClasses() {
|
||||||
|
return new Class<?>[] { SimpleAnnotatedEntity.class, CompositeIdAnnotatedEntity.class };
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract String getJpaMetamodelPopulationValue();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addConfigOptions(Map options) {
|
||||||
|
super.addConfigOptions( options );
|
||||||
|
options.put( AvailableSettings.JPA_METAMODEL_POPULATION, getJpaMetamodelPopulationValue() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMetamodel() {
|
||||||
|
EntityManager entityManager = getOrCreateEntityManager();
|
||||||
|
try {
|
||||||
|
final Metamodel metamodel = entityManager.getMetamodel();
|
||||||
|
|
||||||
|
if ( getJpaMetamodelPopulationValue().equalsIgnoreCase( "disabled" ) ) {
|
||||||
|
// In 5.1, metamodel returned null.
|
||||||
|
// In 5.2+, metamodel erturned as a non-null instance.
|
||||||
|
assertNotNull( metamodel );
|
||||||
|
assertEquals( 0, metamodel.getManagedTypes().size() );
|
||||||
|
assertEquals( 0, metamodel.getEntities().size() );
|
||||||
|
assertEquals( 0, metamodel.getEmbeddables().size() );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertNotNull( metamodel );
|
||||||
|
|
||||||
|
assertManagedTypes( metamodel );
|
||||||
|
assertEntityTypes( metamodel );
|
||||||
|
assertEmbeddableTypes( metamodel );
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
entityManager.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertManagedTypes(Metamodel metamodel) {
|
||||||
|
if ( getJpaMetamodelPopulationValue().equalsIgnoreCase( "enabled" ) ) {
|
||||||
|
// All managed types should be included, dynamic-map and annotation based.
|
||||||
|
// EntityType(SimpleAnnotatedEntity)
|
||||||
|
// EntityType(CompositeIdAnnotatedEntity)
|
||||||
|
// EntityType(null) - SimpleEntity (dynamic-map entity)
|
||||||
|
// EntityType(null) - CompositeIdEntity (dynamic-map entity)
|
||||||
|
// EntityType(null) - CompositeId2Entity (dynamic-map entity)
|
||||||
|
// EmbeddableType(CompositeIdId) - CompositeIdAnnotatedEntity's EmbeddedId identifier
|
||||||
|
// EmbeddableType(Map) - CompositeIdEntity's (dynamic-map entity) identifier
|
||||||
|
// EmbeddableType(Map) - CompositeId2Entity's (dynamic-map entity) identifier
|
||||||
|
assertEquals( 8, metamodel.getManagedTypes().size() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// When ignoreUnsupported is used, any managed-type that refers to a dynamic-map entity type
|
||||||
|
// or a managed type that is owned by said dynamic-map entity type should be excluded.
|
||||||
|
// Therefore this collection should only include 3 elements
|
||||||
|
// EntityType(SimpleAnnotated)
|
||||||
|
// EntityType(CompositeIdAnnotatedEntity)
|
||||||
|
// EmbeddableType(CompositeIdId) - CompositeIdAnnotatedEntity's EmbeddedId identifier
|
||||||
|
assertEquals( 3, metamodel.getManagedTypes().size() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertEntityTypes(Metamodel metamodel) {
|
||||||
|
final Set<String> entityNames = metamodel.getEntities().stream()
|
||||||
|
.map( EntityType::getName )
|
||||||
|
.collect( Collectors.toSet() );
|
||||||
|
|
||||||
|
if ( getJpaMetamodelPopulationValue().equalsIgnoreCase( "enabled" ) ) {
|
||||||
|
// Should include all entity types
|
||||||
|
// EntityType(SimpleAnnotatedEntity)
|
||||||
|
// EntityType(CompositeIdAnnotatedEntity)
|
||||||
|
// EntityType(null) - SimpleEntity (dynamic-map entity)
|
||||||
|
// EntityType(null) - CompositeIdEntity (dynamic-map entity)
|
||||||
|
// EntityType(null) - CompositeId2Entity (dynamic-map entity)
|
||||||
|
assertEquals( 5, entityNames.size() );
|
||||||
|
assertTrue( entityNames.contains( "SimpleAnnotatedEntity" ) );
|
||||||
|
assertTrue( entityNames.contains( "CompositeIdAnnotatedEntity" ) );
|
||||||
|
assertTrue( entityNames.contains( "SimpleEntity" ) );
|
||||||
|
assertTrue( entityNames.contains( "CompositeIdEntity" ) );
|
||||||
|
assertTrue( entityNames.contains( "CompositeId2Entity" ) );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// In 5.1, this returns 5 elements
|
||||||
|
// CompositeIdAnnotatedEntity
|
||||||
|
// SimpleAnnotatedEntity
|
||||||
|
// SimpleEntity <-- this should not exist since its entity-type is filtered
|
||||||
|
// CompositeIdEntity <-- this should not exist since its entity-type is filtered
|
||||||
|
// CompsoiteId2Entity <-- this should not exist since its entity-type is filtered
|
||||||
|
//
|
||||||
|
// In 5.2, this returns 5 elements too.
|
||||||
|
// In 5.3, this returns 5 elements too.
|
||||||
|
assertEquals( 2, entityNames.size() );
|
||||||
|
assertTrue( entityNames.contains( "SimpleAnnotatedEntity" ) );
|
||||||
|
assertTrue( entityNames.contains( "CompositeIdAnnotatedEntity" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertEmbeddableTypes(Metamodel metamodel) {
|
||||||
|
final Set<EmbeddableType<?>> embeddableTypes = metamodel.getEmbeddables();
|
||||||
|
if ( getJpaMetamodelPopulationValue().equalsIgnoreCase( "enabled" ) ) {
|
||||||
|
// EmbeddableType(CompositeIdId) - CompositeIdAnnotatedEntity's EmbeddedId identifier
|
||||||
|
// EmbeddableType(Map) - CompositeIdEntity (dynamic-map entity) identifier
|
||||||
|
// EmbeddableType(Map) - CompositeId2Entity (dynamic-map entity) identifier
|
||||||
|
assertEquals( 3, embeddableTypes.size() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// This should return only 1 element
|
||||||
|
// EmbeddableType(CompositeIdId) - CompositeIdAnnotatedEntity's EmbeddedId identifier
|
||||||
|
// The dynamic-map entity type's composite-id embeddable types should be excluded.
|
||||||
|
assertEquals( 1, embeddableTypes.size() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* 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.jpa.test.metamodel;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-12871")
|
||||||
|
public class JpaMetamodelDisabledPopulationTest extends AbstractJpaMetamodelPopulationTest {
|
||||||
|
@Override
|
||||||
|
protected String getJpaMetamodelPopulationValue() {
|
||||||
|
return "disabled";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* 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.jpa.test.metamodel;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-12871")
|
||||||
|
public class JpaMetamodelEnabledPopulationTest extends AbstractJpaMetamodelPopulationTest {
|
||||||
|
@Override
|
||||||
|
protected String getJpaMetamodelPopulationValue() {
|
||||||
|
return "enabled";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/*
|
||||||
|
* 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.jpa.test.metamodel;
|
||||||
|
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Chris Cranford
|
||||||
|
*/
|
||||||
|
@TestForIssue(jiraKey = "HHH-12871")
|
||||||
|
public class JpaMetamodelIgnoreUnsupportedPopulationTest extends AbstractJpaMetamodelPopulationTest {
|
||||||
|
@Override
|
||||||
|
protected String getJpaMetamodelPopulationValue() {
|
||||||
|
return "ignoreUnsupported";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE hibernate-mapping PUBLIC
|
||||||
|
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||||
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||||
|
|
||||||
|
<hibernate-mapping package="org.hibernate.jpa.test.metamodel">
|
||||||
|
<class entity-name="CompositeId2Entity" table="CompositeId2Entity" >
|
||||||
|
<composite-id name="originalId">
|
||||||
|
<key-property name="id1" type="integer"><column name="id1"/></key-property>
|
||||||
|
<key-property name="id2" type="integer"><column name="id2"/></key-property>
|
||||||
|
</composite-id>
|
||||||
|
<property name="data" type="string" />
|
||||||
|
</class>
|
||||||
|
</hibernate-mapping>
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE hibernate-mapping PUBLIC
|
||||||
|
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||||
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||||
|
|
||||||
|
<hibernate-mapping package="org.hibernate.jpa.test.metamodel">
|
||||||
|
<class entity-name="CompositeIdEntity" table="CompositeIdEntity" >
|
||||||
|
<composite-id name="originalId">
|
||||||
|
<key-property name="id1" type="integer"><column name="id1"/></key-property>
|
||||||
|
<key-property name="id2" type="integer"><column name="id2"/></key-property>
|
||||||
|
</composite-id>
|
||||||
|
<property name="data" type="string" />
|
||||||
|
</class>
|
||||||
|
</hibernate-mapping>
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE hibernate-mapping PUBLIC
|
||||||
|
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||||
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||||
|
|
||||||
|
<hibernate-mapping package="org.hibernate.jpa.test.metamodel">
|
||||||
|
<class entity-name="SimpleEntity" table="SimpleEntity" >
|
||||||
|
<id name="id" type="integer">
|
||||||
|
<generator class="native"/>
|
||||||
|
</id>
|
||||||
|
<property name="data" type="string" />
|
||||||
|
</class>
|
||||||
|
</hibernate-mapping>
|
Loading…
Reference in New Issue