Skip to content

Commit 35c7df3

Browse files
mbelladecigaly
authored andcommitted
HHH-18683 Add test for issue
1 parent a65e615 commit 35c7df3

File tree

2 files changed

+174
-55
lines changed

2 files changed

+174
-55
lines changed

hibernate-core/src/test/java/org/hibernate/orm/test/jpa/compliance/GetJavaTypeTest.java

Lines changed: 0 additions & 55 deletions
This file was deleted.
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.jpa.compliance;
8+
9+
import jakarta.persistence.Embeddable;
10+
import jakarta.persistence.Embedded;
11+
import jakarta.persistence.Entity;
12+
import jakarta.persistence.Id;
13+
import jakarta.persistence.MappedSuperclass;
14+
import jakarta.persistence.metamodel.Attribute;
15+
import jakarta.persistence.metamodel.ManagedType;
16+
import jakarta.persistence.metamodel.MappedSuperclassType;
17+
import jakarta.persistence.metamodel.Metamodel;
18+
import org.hibernate.engine.spi.SessionFactoryImplementor;
19+
import org.hibernate.metamodel.model.domain.EmbeddableDomainType;
20+
import org.hibernate.metamodel.model.domain.EntityDomainType;
21+
import org.hibernate.metamodel.model.domain.JpaMetamodel;
22+
import org.hibernate.metamodel.model.domain.ManagedDomainType;
23+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
24+
import org.hibernate.testing.orm.junit.Jira;
25+
import org.hibernate.testing.orm.junit.Jpa;
26+
import org.junit.jupiter.api.Test;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
import static org.junit.jupiter.api.Assertions.assertEquals;
30+
import static org.junit.jupiter.api.Assertions.assertNotNull;
31+
import static org.junit.jupiter.api.Assertions.fail;
32+
33+
@Jpa(annotatedClasses = {
34+
MetamodelTypesTest.BaseEntity.class,
35+
MetamodelTypesTest.Person.class,
36+
MetamodelTypesTest.Order.class,
37+
})
38+
@Jira( "https://hibernate.atlassian.net/browse/HHH-18683" )
39+
public class MetamodelTypesTest {
40+
@Test
41+
public void getJavaType(EntityManagerFactoryScope scope) {
42+
scope.inEntityManager( entityManager -> {
43+
final Metamodel metaModel = entityManager.getMetamodel();
44+
final ManagedType<Person> mTypeOrder = metaModel.managedType( Person.class );
45+
assertNotNull( mTypeOrder );
46+
final Attribute<Person, ?> attrib = mTypeOrder.getDeclaredAttribute( "age" );
47+
assertNotNull( attrib );
48+
final Class<?> pAttribJavaType = attrib.getJavaType();
49+
assertEquals( "int", pAttribJavaType.getName() );
50+
} );
51+
}
52+
53+
@Test
54+
public void entityTypeTest(EntityManagerFactoryScope scope) {
55+
scope.inEntityManager( entityManager -> {
56+
final JpaMetamodel jpaMetamodel = entityManager.getEntityManagerFactory()
57+
.unwrap( SessionFactoryImplementor.class ).getJpaMetamodel();
58+
59+
// Existing entity type
60+
final EntityDomainType<Person> personType = jpaMetamodel.entity( Person.class );
61+
assertThat( personType ).isNotNull().isSameAs( jpaMetamodel.findEntityType( Person.class ) )
62+
.extracting( EntityDomainType::getName ).isEqualTo( "Person" );
63+
assertThat( jpaMetamodel.entity( Person.class.getName() ) ).isSameAs(
64+
jpaMetamodel.findEntityType( Person.class.getName() ) ).isSameAs( personType );
65+
66+
// Nonexistent entity type
67+
assertThat( jpaMetamodel.findEntityType( Order.class ) ).isNull();
68+
assertThat( jpaMetamodel.findEntityType( "AnotherEntity" ) ).isNull();
69+
try {
70+
jpaMetamodel.entity( "AnotherEntity" );
71+
fail( "Expected IllegalArgumentException for nonexistent entity type" );
72+
}
73+
catch (IllegalArgumentException e) {
74+
assertThat( e ).hasMessageContaining( "Not an entity" );
75+
}
76+
try {
77+
jpaMetamodel.entity( Order.class.getName() );
78+
fail( "Expected IllegalArgumentException for embeddable type requested as entity" );
79+
}
80+
catch (IllegalArgumentException e) {
81+
assertThat( e ).hasMessageContaining( "Not an entity" );
82+
}
83+
} );
84+
}
85+
86+
@Test
87+
public void mappedSuperclassTypeTest(EntityManagerFactoryScope scope) {
88+
scope.inEntityManager( entityManager -> {
89+
final JpaMetamodel jpaMetamodel = entityManager.getEntityManagerFactory()
90+
.unwrap( SessionFactoryImplementor.class ).getJpaMetamodel();
91+
92+
// Existing mapped superclass type
93+
final ManagedDomainType<BaseEntity> baseEntityType = jpaMetamodel.managedType( BaseEntity.class );
94+
assertThat( baseEntityType ).isInstanceOf( MappedSuperclassType.class )
95+
.isSameAs( jpaMetamodel.findManagedType( BaseEntity.class ) )
96+
.extracting( ManagedDomainType::getTypeName ).isEqualTo( BaseEntity.class.getName() );
97+
assertThat( jpaMetamodel.managedType( BaseEntity.class.getName() ) ).isSameAs(
98+
jpaMetamodel.findManagedType( BaseEntity.class.getName() ) ).isSameAs( baseEntityType );
99+
100+
// Nonexistent mapped superclass type
101+
assertThat( jpaMetamodel.findManagedType( MetamodelTypesTest.class ) ).isNull();
102+
assertThat( jpaMetamodel.findManagedType( "AnotherEntity" ) ).isNull();
103+
try {
104+
jpaMetamodel.managedType( "AnotherEntity" );
105+
fail( "Expected IllegalArgumentException for nonexistent entity type" );
106+
}
107+
catch (IllegalArgumentException e) {
108+
assertThat( e ).hasMessageContaining( "Not a managed type" );
109+
}
110+
try {
111+
jpaMetamodel.managedType( MetamodelTypesTest.class );
112+
fail( "Expected IllegalArgumentException for embeddable type requested as entity" );
113+
}
114+
catch (IllegalArgumentException e) {
115+
assertThat( e ).hasMessageContaining( "Not a managed type" );
116+
}
117+
} );
118+
}
119+
120+
@Test
121+
public void embeddableTypeTest(EntityManagerFactoryScope scope) {
122+
scope.inEntityManager( entityManager -> {
123+
final JpaMetamodel jpaMetamodel = entityManager.getEntityManagerFactory()
124+
.unwrap( SessionFactoryImplementor.class ).getJpaMetamodel();
125+
126+
// Existing mapped superclass type
127+
final EmbeddableDomainType<Order> embeddableType = jpaMetamodel.embeddable( Order.class );
128+
assertThat( embeddableType ).isNotNull().isSameAs( jpaMetamodel.findEmbeddableType( Order.class ) )
129+
.extracting( ManagedDomainType::getTypeName ).isEqualTo( Order.class.getName() );
130+
assertThat( jpaMetamodel.embeddable( Order.class.getName() ) ).isSameAs(
131+
jpaMetamodel.findEmbeddableType( Order.class.getName() ) ).isSameAs( embeddableType );
132+
133+
// Nonexistent mapped superclass type
134+
assertThat( jpaMetamodel.findEmbeddableType( BaseEntity.class ) ).isNull();
135+
assertThat( jpaMetamodel.findEmbeddableType( "AnotherEmbeddable" ) ).isNull();
136+
try {
137+
jpaMetamodel.embeddable( "AnotherEmbeddable" );
138+
fail( "Expected IllegalArgumentException for nonexistent entity type" );
139+
}
140+
catch (IllegalArgumentException e) {
141+
assertThat( e ).hasMessageContaining( "Not an embeddable" );
142+
}
143+
try {
144+
jpaMetamodel.embeddable( Person.class );
145+
fail( "Expected IllegalArgumentException for embeddable type requested as entity" );
146+
}
147+
catch (IllegalArgumentException e) {
148+
assertThat( e ).hasMessageContaining( "Not an embeddable" );
149+
}
150+
} );
151+
}
152+
153+
@MappedSuperclass
154+
public static abstract class BaseEntity {
155+
@Id
156+
private int id;
157+
}
158+
159+
@Entity(name = "Person")
160+
public static class Person extends BaseEntity {
161+
private String name;
162+
163+
private int age;
164+
165+
@Embedded
166+
private Order order;
167+
}
168+
169+
@Embeddable
170+
public static class Order {
171+
private Integer number;
172+
private String item;
173+
}
174+
}

0 commit comments

Comments
 (0)