Skip to content

Commit 3631832

Browse files
committed
HHH-19943 Add test for issue
1 parent 5dd29f8 commit 3631832

File tree

6 files changed

+200
-0
lines changed

6 files changed

+200
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.metamodel.generics.embeddedid;
6+
7+
import jakarta.persistence.EmbeddedId;
8+
import jakarta.persistence.MappedSuperclass;
9+
10+
@MappedSuperclass
11+
public abstract class BaseEntity<ID> {
12+
@EmbeddedId
13+
private ID id;
14+
15+
private String name;
16+
17+
public BaseEntity() {
18+
}
19+
20+
public BaseEntity(ID id, String name) {
21+
this.id = id;
22+
this.name = name;
23+
}
24+
25+
public ID getId() {
26+
return id;
27+
}
28+
29+
public String getName() {
30+
return name;
31+
}
32+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.metamodel.generics.embeddedid;
6+
7+
import jakarta.persistence.Entity;
8+
9+
@Entity
10+
public class EmployeeEntity extends BaseEntity<EmployeeId> {
11+
private Integer employeeNumber;
12+
13+
public EmployeeEntity() {
14+
}
15+
16+
public EmployeeEntity(EmployeeId id, String name, Integer employeeNumber) {
17+
super( id, name );
18+
this.employeeNumber = employeeNumber;
19+
}
20+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.metamodel.generics.embeddedid;
6+
7+
import jakarta.persistence.Embeddable;
8+
9+
@Embeddable
10+
public class EmployeeId {
11+
private String employeeCode;
12+
private PersonId personId;
13+
14+
public EmployeeId() {
15+
}
16+
17+
public EmployeeId(String employeeCode, PersonId personId) {
18+
this.employeeCode = employeeCode;
19+
this.personId = personId;
20+
}
21+
22+
public String getEmployeeCode() {
23+
return employeeCode;
24+
}
25+
26+
public PersonId getPersonId() {
27+
return personId;
28+
}
29+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.metamodel.generics.embeddedid;
6+
7+
import jakarta.persistence.criteria.Path;
8+
import org.hibernate.SessionFactory;
9+
import org.hibernate.query.sqm.tree.domain.SqmPath;
10+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
11+
import org.hibernate.testing.orm.junit.Jpa;
12+
import org.junit.jupiter.api.AfterAll;
13+
import org.junit.jupiter.api.BeforeAll;
14+
import org.junit.jupiter.api.Test;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
19+
/**
20+
* @author Marco Belladelli
21+
*/
22+
@Jpa(annotatedClasses = {
23+
BaseEntity.class,
24+
PersonEntity.class,
25+
PersonId.class,
26+
EmployeeEntity.class,
27+
EmployeeId.class,
28+
})
29+
public class GenericEmbeddedIdMetamodelTest {
30+
@SuppressWarnings({"unchecked", "rawtypes"})
31+
@Test
32+
public void test(EntityManagerFactoryScope scope) {
33+
scope.inTransaction( entityManager -> {
34+
var criteriaBuilder = entityManager.getCriteriaBuilder();
35+
var query = criteriaBuilder.createQuery( EmployeeEntity.class );
36+
37+
var employee = query.from( EmployeeEntity.class );
38+
var person = query.from( PersonEntity.class );
39+
40+
final Path employeeId = employee.get( EmployeeEntity_.id );
41+
// The Path.getModel() method returns the generic (Object) type, whereas our getResolvedModel()
42+
// returns the correct EmployeeId type.
43+
assertThat( employeeId.getModel().getBindableJavaType() ).isEqualTo( Object.class );
44+
assertThat( ((SqmPath<?>) employeeId).getResolvedModel().getBindableJavaType() ).isEqualTo( EmployeeId.class );
45+
final Path employeePersonId = employeeId.get( EmployeeId_.personId );
46+
assertThat( employeePersonId.getModel().getBindableJavaType() ).isEqualTo( PersonId.class );
47+
final var personId = person.get( PersonEntity_.id );
48+
// Same as before: generic vs resolved type
49+
assertThat( personId.getModel().getBindableJavaType() ).isEqualTo( Object.class );
50+
assertThat( ((SqmPath<?>) employeeId).getResolvedModel().getBindableJavaType() ).isEqualTo( EmployeeId.class );
51+
52+
var equal = criteriaBuilder.equal(
53+
employeePersonId,
54+
personId
55+
);
56+
57+
query.select( employee ).where( equal );
58+
59+
final var result = entityManager.createQuery( query ).getSingleResult();
60+
assertThat( result.getName() ).isEqualTo( "Employee One" );
61+
assertThat( result.getId().getPersonId().getIdentifier() ).isEqualTo( 1L );
62+
} );
63+
}
64+
65+
@BeforeAll
66+
public void setUp(EntityManagerFactoryScope scope) {
67+
scope.inTransaction( entityManager -> {
68+
entityManager.persist( new PersonEntity( new PersonId( 1L ), "Person One" ) );
69+
entityManager.persist( new PersonEntity( new PersonId( 2L ), "Person Two" ) );
70+
entityManager.persist(
71+
new EmployeeEntity( new EmployeeId( "E001", new PersonId( 1L ) ), "Employee One", 1001 ) );
72+
} );
73+
}
74+
75+
@AfterAll
76+
public void tearDown(EntityManagerFactoryScope scope) {
77+
scope.getEntityManagerFactory().unwrap( SessionFactory.class ).getSchemaManager().truncateMappedObjects();
78+
}
79+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.metamodel.generics.embeddedid;
6+
7+
import jakarta.persistence.Entity;
8+
9+
@Entity
10+
public class PersonEntity extends BaseEntity<PersonId> {
11+
public PersonEntity() {
12+
}
13+
14+
public PersonEntity(PersonId id, String name) {
15+
super( id, name );
16+
}
17+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.metamodel.generics.embeddedid;
6+
7+
import jakarta.persistence.Embeddable;
8+
9+
@Embeddable
10+
public class PersonId {
11+
private Long identifier;
12+
13+
public PersonId() {
14+
}
15+
16+
public PersonId(Long identifier) {
17+
this.identifier = identifier;
18+
}
19+
20+
public Long getIdentifier() {
21+
return identifier;
22+
}
23+
}

0 commit comments

Comments
 (0)