mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-18 00:55:16 +00:00
HHH-17408 Test persisting and loading for a bidirectional OneToOne involving polymorphism
This commit is contained in:
parent
f9473feff0
commit
f00c57d629
@ -6,20 +6,22 @@
|
|||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.onetoone.polymorphism;
|
package org.hibernate.orm.test.onetoone.polymorphism;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
import org.hibernate.Hibernate;
|
||||||
|
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
|
import org.hibernate.testing.orm.junit.JiraKey;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import jakarta.persistence.Entity;
|
import jakarta.persistence.Entity;
|
||||||
import jakarta.persistence.FetchType;
|
import jakarta.persistence.FetchType;
|
||||||
import jakarta.persistence.Id;
|
import jakarta.persistence.Id;
|
||||||
import jakarta.persistence.OneToOne;
|
import jakarta.persistence.OneToOne;
|
||||||
import org.assertj.core.api.InstanceOfAssertFactories;
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
|
||||||
@DomainModel(annotatedClasses = {
|
@DomainModel(annotatedClasses = {
|
||||||
BidirectionalOneToOnePolymorphismTest.Level1.class,
|
BidirectionalOneToOnePolymorphismTest.Level1.class,
|
||||||
@ -28,48 +30,72 @@
|
|||||||
BidirectionalOneToOnePolymorphismTest.Level3.class
|
BidirectionalOneToOnePolymorphismTest.Level3.class
|
||||||
})
|
})
|
||||||
@SessionFactory
|
@SessionFactory
|
||||||
|
@JiraKey( "HHH-17408" )
|
||||||
public class BidirectionalOneToOnePolymorphismTest {
|
public class BidirectionalOneToOnePolymorphismTest {
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public void setUp(SessionFactoryScope scope) {
|
||||||
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Level1 level1 = new Level1();
|
||||||
|
level1.setId( 1 );
|
||||||
|
|
||||||
|
DerivedLevel2 level2 = new DerivedLevel2();
|
||||||
|
level2.setId( 2 );
|
||||||
|
level1.setDerivedLevel2( level2 );
|
||||||
|
level2.setLevel1( level1 );
|
||||||
|
|
||||||
|
Level3 level3 = new Level3();
|
||||||
|
level3.setId( 3 );
|
||||||
|
level2.setLevel3( level3 );
|
||||||
|
level3.setLevel2( level2 );
|
||||||
|
|
||||||
|
session.persist( level1 );
|
||||||
|
session.persist( level2 );
|
||||||
|
session.persist( level3 );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void persistAndLoad(SessionFactoryScope scope) {
|
public void loadAndUnProxyTest(SessionFactoryScope scope) {
|
||||||
scope.inTransaction( session -> {
|
scope.inTransaction( session -> {
|
||||||
Level1 level1 = new Level1();
|
Level1 reference = session.getReference( Level1.class, 1 );
|
||||||
level1.setId( 1 );
|
assertThat( reference )
|
||||||
|
.extracting( Level1::getDerivedLevel2 )
|
||||||
DerivedLevel2 level2 = new DerivedLevel2();
|
.isNotNull();
|
||||||
level2.setId( 2 );
|
|
||||||
level1.setDerivedLevel2( level2 );
|
|
||||||
level2.setLevel1( level1 );
|
|
||||||
|
|
||||||
Level3 level3 = new Level3();
|
|
||||||
level3.setId( 3 );
|
|
||||||
level2.setLevel3( level3 );
|
|
||||||
level3.setLevel2( level2 );
|
|
||||||
|
|
||||||
session.persist( level1 );
|
|
||||||
session.persist( level2 );
|
|
||||||
session.persist( level3 );
|
|
||||||
} );
|
} );
|
||||||
|
|
||||||
// This succeeds, so the information was properly saved
|
scope.inTransaction(
|
||||||
scope.inTransaction( session -> assertThat( session.getReference( Level1.class, 1 ) )
|
session -> {
|
||||||
.extracting( Level1::getDerivedLevel2 )
|
Level2 level2Proxy = session.getReference( Level2.class, 2 );
|
||||||
.isNotNull() );
|
assertFalse( Hibernate.isInitialized( level2Proxy ) );
|
||||||
|
|
||||||
// This succeeds too, so unproxying works at least in some cases
|
Object unproxy = Hibernate.unproxy( level2Proxy );
|
||||||
scope.inTransaction( session -> assertThat( session.getReference( Level2.class, 2 ) )
|
assertThat( unproxy ).isInstanceOf( DerivedLevel2.class );
|
||||||
.extracting( Hibernate::unproxy, InstanceOfAssertFactories.type( DerivedLevel2.class ) )
|
DerivedLevel2 level2 = (DerivedLevel2) unproxy;
|
||||||
.extracting( DerivedLevel2::getLevel1 )
|
|
||||||
.extracting( Level1::getDerivedLevel2 )
|
|
||||||
.isNotNull() );
|
|
||||||
|
|
||||||
// This fails for some reason
|
Level1 level1 = level2.getLevel1();
|
||||||
scope.inTransaction( session -> assertThat( session.getReference( Level3.class, 3 ) )
|
DerivedLevel2 derivedLevel2 = level1.getDerivedLevel2();
|
||||||
.extracting( Level3::getLevel2 )
|
assertThat( derivedLevel2 ).isNotNull();
|
||||||
.extracting( Hibernate::unproxy, InstanceOfAssertFactories.type( DerivedLevel2.class ) )
|
assertThat( derivedLevel2 ).isSameAs( level2 );
|
||||||
.extracting( DerivedLevel2::getLevel1 )
|
} );
|
||||||
.extracting( Level1::getDerivedLevel2 )
|
|
||||||
.isNotNull() );
|
scope.inTransaction(
|
||||||
|
session -> {
|
||||||
|
Level3 level3Proxy = session.getReference( Level3.class, 3 );
|
||||||
|
assertFalse( Hibernate.isInitialized( level3Proxy ) );
|
||||||
|
|
||||||
|
Object unproxy = Hibernate.unproxy( level3Proxy.getLevel2() );
|
||||||
|
|
||||||
|
assertThat( unproxy ).isInstanceOf( DerivedLevel2.class );
|
||||||
|
DerivedLevel2 level2 = (DerivedLevel2) unproxy;
|
||||||
|
|
||||||
|
Level1 level1 = level2.getLevel1();
|
||||||
|
DerivedLevel2 derivedLevel2 = level1.getDerivedLevel2();
|
||||||
|
assertThat( derivedLevel2 ).isNotNull();
|
||||||
|
assertThat( derivedLevel2 ).isSameAs( level2 );
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(name = "Level1")
|
@Entity(name = "Level1")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user