Skip to content

Commit 6ceec9d

Browse files
authored
Support @Struct aggregate embeddable mapping (#89)
HIBERNATE-59
1 parent 21096b1 commit 6ceec9d

19 files changed

+1277
-194
lines changed

src/integrationTest/java/com/mongodb/hibernate/BasicCrudIntegrationTests.java

Lines changed: 4 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@
1616

1717
package com.mongodb.hibernate;
1818

19-
import static com.mongodb.hibernate.MongoTestAssertions.assertEquals;
19+
import static com.mongodb.hibernate.MongoTestAssertions.assertEq;
2020
import static org.assertj.core.api.Assertions.assertThat;
2121

2222
import com.mongodb.client.MongoCollection;
2323
import com.mongodb.hibernate.junit.InjectMongoCollection;
2424
import com.mongodb.hibernate.junit.MongoExtension;
25-
import jakarta.persistence.Column;
26-
import jakarta.persistence.Embeddable;
2725
import jakarta.persistence.Entity;
2826
import jakarta.persistence.Id;
2927
import jakarta.persistence.Table;
@@ -39,10 +37,7 @@
3937

4038
@SessionFactory(exportSchema = false)
4139
@DomainModel(
42-
annotatedClasses = {
43-
BasicCrudIntegrationTests.Book.class,
44-
BasicCrudIntegrationTests.BookWithEmbeddedField.class,
45-
BasicCrudIntegrationTests.BookDynamicallyUpdated.class
40+
annotatedClasses = {BasicCrudIntegrationTests.Book.class, BasicCrudIntegrationTests.BookDynamicallyUpdated.class
4641
})
4742
@ExtendWith(MongoExtension.class)
4843
class BasicCrudIntegrationTests implements SessionFactoryScopeAware {
@@ -106,31 +101,6 @@ void testEntityWithNullFieldValueInsertion() {
106101
.formatted(author));
107102
assertCollectionContainsExactly(expectedDocument);
108103
}
109-
110-
@Test
111-
void testEntityWithEmbeddedFieldInsertion() {
112-
sessionFactoryScope.inTransaction(session -> {
113-
var book = new BookWithEmbeddedField();
114-
book.id = 1;
115-
book.title = "War and Peace";
116-
var author = new Author();
117-
author.firstName = "Leo";
118-
author.lastName = "Tolstoy";
119-
book.author = author;
120-
book.publishYear = 1867;
121-
session.persist(book);
122-
});
123-
var expectedDocument = BsonDocument.parse(
124-
"""
125-
{
126-
_id: 1,
127-
title: "War and Peace",
128-
authorFirstName: "Leo",
129-
authorLastName: "Tolstoy",
130-
publishYear: 1867
131-
}""");
132-
assertCollectionContainsExactly(expectedDocument);
133-
}
134104
}
135105

136106
@Nested
@@ -219,7 +189,7 @@ void testFindByPrimaryKeyWithoutNullValueField() {
219189

220190
sessionFactoryScope.inTransaction(session -> session.persist(book));
221191
var loadedBook = sessionFactoryScope.fromTransaction(session -> session.find(Book.class, 1));
222-
assertEquals(book, loadedBook);
192+
assertEq(book, loadedBook);
223193
}
224194

225195
@Test
@@ -236,7 +206,7 @@ void testFindByPrimaryKeyWithNullValueField() {
236206

237207
sessionFactoryScope.inTransaction(session -> session.persist(book));
238208
var loadedBook = sessionFactoryScope.fromTransaction(session -> session.find(Book.class, 1));
239-
assertEquals(book, loadedBook);
209+
assertEq(book, loadedBook);
240210
}
241211
}
242212

@@ -270,27 +240,4 @@ static class BookDynamicallyUpdated {
270240

271241
int publishYear;
272242
}
273-
274-
@Entity
275-
@Table(name = "books")
276-
static class BookWithEmbeddedField {
277-
@Id
278-
int id;
279-
280-
String title;
281-
282-
Author author;
283-
284-
int publishYear;
285-
}
286-
287-
@Embeddable
288-
static class Author {
289-
290-
@Column(name = "authorFirstName")
291-
String firstName;
292-
293-
@Column(name = "authorLastName")
294-
String lastName;
295-
}
296243
}

src/integrationTest/java/com/mongodb/hibernate/MongoTestAssertions.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020

21+
import java.util.function.BiConsumer;
22+
import org.assertj.core.api.RecursiveComparisonAssert;
2123
import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration;
2224
import org.jspecify.annotations.Nullable;
2325

@@ -29,12 +31,20 @@ private MongoTestAssertions() {}
2931
* {@link org.junit.jupiter.api.Assertions#assertEquals(Object, Object)}. It should work even if
3032
* {@code expected}/{@code actual} does not override {@link Object#equals(Object)}.
3133
*/
32-
public static void assertEquals(@Nullable Object expected, @Nullable Object actual) {
33-
assertThat(actual)
34-
.usingRecursiveComparison()
35-
.usingOverriddenEquals()
36-
.withStrictTypeChecking()
37-
.isEqualTo(expected);
34+
public static void assertEq(@Nullable Object expected, @Nullable Object actual) {
35+
assertUsingRecursiveComparison(expected, actual, RecursiveComparisonAssert::isEqualTo);
36+
}
37+
38+
public static void assertUsingRecursiveComparison(
39+
@Nullable Object expected,
40+
@Nullable Object actual,
41+
BiConsumer<RecursiveComparisonAssert<?>, Object> assertion) {
42+
assertion.accept(
43+
assertThat(expected)
44+
.usingRecursiveComparison()
45+
.usingOverriddenEquals()
46+
.withStrictTypeChecking(),
47+
actual);
3848
}
3949

4050
/**

src/integrationTest/java/com/mongodb/hibernate/boot/FailedBootstrappingIntegrationTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import com.mongodb.hibernate.junit.MongoExtension;
2424
import org.bson.BsonDocument;
2525
import org.bson.BsonString;
26-
import org.hibernate.cfg.Configuration;
26+
import org.hibernate.boot.MetadataSources;
2727
import org.junit.jupiter.api.Test;
2828
import org.junit.jupiter.api.extension.ExtendWith;
2929

@@ -50,7 +50,7 @@ void couldNotInstantiateDialect() {
5050
}
5151
}
5252
"""))) {
53-
new Configuration().buildSessionFactory().close();
53+
new MetadataSources().buildMetadata();
5454
}
5555
})
5656
.hasRootCause(

0 commit comments

Comments
 (0)