Skip to content

Commit c558fb7

Browse files
committed
HHH-15074 Support for partially-generated @EmbeddedIds
1 parent c700dcd commit c558fb7

File tree

3 files changed

+187
-6
lines changed

3 files changed

+187
-6
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/internal/EmbeddableBinder.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ static Component fillEmbeddable(
387387
);
388388

389389
final XProperty property = propertyAnnotatedElement.getProperty();
390-
if ( isGeneratedId( property ) ) {
390+
if ( property.isAnnotationPresent( GeneratedValue.class ) ) {
391391
processGeneratedId( context, component, property );
392392
}
393393
}
@@ -467,11 +467,6 @@ private static List<PropertyData> collectBaseClassElements(
467467
}
468468
}
469469

470-
private static boolean isGeneratedId(XProperty property) {
471-
return property.isAnnotationPresent( GeneratedValue.class )
472-
&& property.isAnnotationPresent( Id.class );
473-
}
474-
475470
private static void processCompositeUserType(Component component, CompositeUserType<?> compositeUserType) {
476471
component.sortProperties();
477472
final List<String> sortedPropertyNames = new ArrayList<>( component.getPropertySpan() );
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
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.mapping.identifier;
8+
9+
import java.io.Serializable;
10+
11+
import org.hibernate.testing.orm.junit.DomainModel;
12+
import org.hibernate.testing.orm.junit.Jira;
13+
import org.hibernate.testing.orm.junit.SessionFactory;
14+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
15+
import org.junit.jupiter.api.AfterAll;
16+
import org.junit.jupiter.api.Test;
17+
18+
import jakarta.persistence.Embeddable;
19+
import jakarta.persistence.EmbeddedId;
20+
import jakarta.persistence.Entity;
21+
import jakarta.persistence.GeneratedValue;
22+
23+
import static org.assertj.core.api.Assertions.assertThat;
24+
25+
/**
26+
* @author Marco Belladelli
27+
*/
28+
@DomainModel( annotatedClasses = {
29+
EmbeddedIdGeneratedValueTest.SystemUser.class,
30+
EmbeddedIdGeneratedValueTest.PK.class,
31+
} )
32+
@SessionFactory
33+
@Jira( "https://hibernate.atlassian.net/browse/HHH-15074" )
34+
public class EmbeddedIdGeneratedValueTest {
35+
@AfterAll
36+
public void tearDown(SessionFactoryScope scope) {
37+
scope.inTransaction( session -> session.createMutationQuery( "delete from SystemUser" ).executeUpdate() );
38+
}
39+
40+
@Test
41+
public void test(SessionFactoryScope scope) {
42+
final SystemUser _systemUser = scope.fromTransaction( session -> {
43+
final SystemUser systemUser = new SystemUser();
44+
systemUser.setId( new PK( "mbladel" ) );
45+
systemUser.setName( "Marco Belladelli" );
46+
session.persist( systemUser );
47+
return systemUser;
48+
} );
49+
50+
scope.inSession( session -> {
51+
final SystemUser systemUser = session.find( SystemUser.class, _systemUser.getId() );
52+
assertThat( systemUser.getName() ).isEqualTo( "Marco Belladelli" );
53+
assertThat( systemUser.getId().getUsername() ).isEqualTo( "mbladel" );
54+
assertThat( systemUser.getId().getRegistrationId() ).isNotNull();
55+
} );
56+
}
57+
58+
@Entity( name = "SystemUser" )
59+
public static class SystemUser {
60+
@EmbeddedId
61+
private PK id;
62+
63+
private String name;
64+
65+
public PK getId() {
66+
return id;
67+
}
68+
69+
public void setId(PK id) {
70+
this.id = id;
71+
}
72+
73+
public String getName() {
74+
return name;
75+
}
76+
77+
public void setName(String name) {
78+
this.name = name;
79+
}
80+
}
81+
82+
@Embeddable
83+
public static class PK implements Serializable {
84+
private String username;
85+
86+
@GeneratedValue
87+
private Integer registrationId;
88+
89+
public PK() {
90+
}
91+
92+
public PK(String username) {
93+
this.username = username;
94+
}
95+
96+
public String getUsername() {
97+
return username;
98+
}
99+
100+
public Integer getRegistrationId() {
101+
return registrationId;
102+
}
103+
}
104+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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.records;
8+
9+
import org.hibernate.testing.orm.junit.DomainModel;
10+
import org.hibernate.testing.orm.junit.Jira;
11+
import org.hibernate.testing.orm.junit.SessionFactory;
12+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
13+
import org.junit.jupiter.api.AfterAll;
14+
import org.junit.jupiter.api.Test;
15+
16+
import jakarta.persistence.Embeddable;
17+
import jakarta.persistence.EmbeddedId;
18+
import jakarta.persistence.Entity;
19+
import jakarta.persistence.GeneratedValue;
20+
21+
import static org.assertj.core.api.Assertions.assertThat;
22+
23+
/**
24+
* @author Marco Belladelli
25+
*/
26+
@DomainModel( annotatedClasses = {
27+
RecordEmbeddedIdGeneratedValueTest.SystemUser.class,
28+
RecordEmbeddedIdGeneratedValueTest.PK.class,
29+
} )
30+
@SessionFactory
31+
@Jira( "https://hibernate.atlassian.net/browse/HHH-15074" )
32+
public class RecordEmbeddedIdGeneratedValueTest {
33+
@AfterAll
34+
public void tearDown(SessionFactoryScope scope) {
35+
scope.inTransaction( session -> session.createMutationQuery( "delete from SystemUser" ).executeUpdate() );
36+
}
37+
38+
@Test
39+
public void test(SessionFactoryScope scope) {
40+
final SystemUser _systemUser = scope.fromTransaction( session -> {
41+
final SystemUser systemUser = new SystemUser();
42+
systemUser.setId( new PK( "mbladel", null ) );
43+
systemUser.setName( "Marco Belladelli" );
44+
session.persist( systemUser );
45+
return systemUser;
46+
} );
47+
48+
scope.inSession( session -> {
49+
final SystemUser systemUser = session.find( SystemUser.class, _systemUser.getId() );
50+
assertThat( systemUser.getName() ).isEqualTo( "Marco Belladelli" );
51+
assertThat( systemUser.getId().username() ).isEqualTo( "mbladel" );
52+
assertThat( systemUser.getId().registrationId() ).isNotNull();
53+
} );
54+
}
55+
56+
@Entity( name = "SystemUser" )
57+
public static class SystemUser {
58+
@EmbeddedId
59+
private PK id;
60+
61+
private String name;
62+
63+
public PK getId() {
64+
return id;
65+
}
66+
67+
public void setId(PK id) {
68+
this.id = id;
69+
}
70+
71+
public String getName() {
72+
return name;
73+
}
74+
75+
public void setName(String name) {
76+
this.name = name;
77+
}
78+
}
79+
80+
@Embeddable
81+
public record PK(String username, @GeneratedValue Integer registrationId) {}
82+
}

0 commit comments

Comments
 (0)