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