Skip to content

Commit 63022bd

Browse files
committed
basics of a test showing failure
1 parent 1b00f69 commit 63022bd

File tree

5 files changed

+397
-0
lines changed

5 files changed

+397
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.jpa.broken;
6+
7+
import jakarta.persistence.EntityManager;
8+
import jakarta.persistence.criteria.CriteriaQuery;
9+
import jakarta.persistence.criteria.Root;
10+
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;
11+
import org.junit.Before;
12+
import org.junit.Test;
13+
14+
import java.util.List;
15+
import java.util.Map;
16+
import java.util.Objects;
17+
import java.util.stream.LongStream;
18+
19+
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
20+
21+
public class JPAUnitTestCase extends BaseEntityManagerFunctionalTestCase {
22+
23+
24+
@Override
25+
public Class<?>[] getAnnotatedClasses() {
26+
return new Class[] {ThirdParty.class, Provider.class, VoiceGroup.class, TelephoneNumber.class};
27+
}
28+
29+
@Before
30+
public void setup() {
31+
doInJPA( this::entityManagerFactory, em -> {
32+
33+
ThirdParty thirdParty = new ThirdParty();
34+
thirdParty.setName( "Globex Corporation" );
35+
em.persist( thirdParty );
36+
37+
Provider provider = new Provider();
38+
provider.setThirdParty( thirdParty );
39+
em.persist( provider );
40+
41+
VoiceGroup voiceGroup = new VoiceGroup();
42+
em.persist( voiceGroup );
43+
44+
TelephoneNumber primaryNumber = new TelephoneNumber();
45+
primaryNumber.setNumber( "4065551234" );
46+
primaryNumber.setProvider( provider );
47+
primaryNumber.setVoiceGroup( voiceGroup );
48+
em.persist( primaryNumber );
49+
50+
voiceGroup.setPrimaryNumber( primaryNumber );
51+
52+
LongStream.rangeClosed( 4065551235L, 4065551255L ).forEach( value -> {
53+
TelephoneNumber telephoneNumber = new TelephoneNumber();
54+
telephoneNumber.setNumber( String.valueOf( value ) );
55+
telephoneNumber.setProvider( provider );
56+
telephoneNumber.setVoiceGroup( voiceGroup );
57+
em.persist( telephoneNumber );
58+
} );
59+
} );
60+
}
61+
62+
@Test
63+
public void testThatPasses() {
64+
EntityManager em = getOrCreateEntityManager();
65+
em.getTransaction().begin();
66+
VoiceGroup voiceGroup = em.find( VoiceGroup.class, 1,
67+
Map.of( "jakarta.persistence.fetchgraph", em.getEntityGraph( "voiceGroup.graph" ) ) );
68+
allNumbersWithThirdPartyFetch( em, voiceGroup ).forEach( telephoneNumber -> Objects.requireNonNull( telephoneNumber.getProvider().getName() ) );
69+
em.getTransaction().commit();
70+
em.close();
71+
}
72+
73+
@Test
74+
public void testThatFails() {
75+
EntityManager em = getOrCreateEntityManager();
76+
em.getTransaction().begin();
77+
VoiceGroup voiceGroup = em.find( VoiceGroup.class, 1,
78+
Map.of( "jakarta.persistence.fetchgraph", em.getEntityGraph( "voiceGroup.graph" ) ) );
79+
allNumbersWithoutThirdPartyFetch( em, voiceGroup ).forEach( telephoneNumber -> Objects.requireNonNull( telephoneNumber.getProvider().getName() ) );
80+
em.getTransaction().commit();
81+
em.close();
82+
}
83+
84+
85+
private List<TelephoneNumber> allNumbersWithoutThirdPartyFetch(EntityManager em, VoiceGroup voiceGroup) {
86+
CriteriaQuery<TelephoneNumber> query = em.getCriteriaBuilder().createQuery( TelephoneNumber.class );
87+
Root<TelephoneNumber> root = query.from( TelephoneNumber.class );
88+
root.fetch( "provider" );
89+
query.where( em.getCriteriaBuilder().equal( root.get( "voiceGroup" ), voiceGroup ) );
90+
return em.createQuery( query ).getResultList();
91+
}
92+
93+
private List<TelephoneNumber> allNumbersWithThirdPartyFetch(EntityManager em, VoiceGroup voiceGroup) {
94+
CriteriaQuery<TelephoneNumber> query = em.getCriteriaBuilder().createQuery( TelephoneNumber.class );
95+
Root<TelephoneNumber> root = query.from( TelephoneNumber.class );
96+
root.fetch( "provider" ).fetch( "thirdParty" );
97+
query.where( em.getCriteriaBuilder().equal( root.get( "voiceGroup" ), voiceGroup ) );
98+
return em.createQuery( query ).getResultList();
99+
}
100+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.jpa.broken;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.GeneratedValue;
9+
import jakarta.persistence.GenerationType;
10+
import jakarta.persistence.Id;
11+
import jakarta.persistence.OneToOne;
12+
import jakarta.persistence.Transient;
13+
import jakarta.persistence.Version;
14+
15+
import java.io.Serializable;
16+
import java.util.Objects;
17+
18+
@Entity
19+
public class Provider implements Serializable {
20+
21+
private Integer id;
22+
private int version;
23+
private ThirdParty thirdParty;
24+
25+
@Id
26+
@GeneratedValue(strategy = GenerationType.IDENTITY)
27+
public Integer getId() {
28+
return id;
29+
}
30+
31+
public void setId(Integer id) {
32+
this.id = id;
33+
}
34+
35+
@Version
36+
public int getVersion() {
37+
return version;
38+
}
39+
40+
public void setVersion(int version) {
41+
this.version = version;
42+
}
43+
44+
@OneToOne(mappedBy = "provider", optional = false)
45+
public ThirdParty getThirdParty() {
46+
return thirdParty;
47+
}
48+
49+
public void setThirdParty(ThirdParty thirdParty) {
50+
this.thirdParty = thirdParty;
51+
}
52+
53+
@Transient
54+
public String getName() {
55+
return thirdParty.getName();
56+
}
57+
58+
@Override
59+
public boolean equals(Object o) {
60+
if (o instanceof Provider provider) {
61+
return this == o || getId().equals(provider.getId());
62+
}
63+
else {
64+
return false;
65+
}
66+
}
67+
68+
@Override
69+
public int hashCode() {
70+
return Objects.hashCode(id);
71+
}
72+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.jpa.broken;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.FetchType;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.GenerationType;
11+
import jakarta.persistence.Id;
12+
import jakarta.persistence.JoinColumn;
13+
import jakarta.persistence.ManyToOne;
14+
import jakarta.persistence.Version;
15+
16+
import java.io.Serializable;
17+
import java.util.Objects;
18+
19+
@Entity
20+
public class TelephoneNumber implements Serializable {
21+
22+
private Integer id;
23+
private int version;
24+
private String number;
25+
private VoiceGroup voiceGroup;
26+
private Provider provider;
27+
28+
@Id
29+
@GeneratedValue(strategy = GenerationType.IDENTITY)
30+
public Integer getId() {
31+
return id;
32+
}
33+
34+
public void setId(Integer id) {
35+
this.id = id;
36+
}
37+
38+
@Version
39+
public int getVersion() {
40+
return version;
41+
}
42+
43+
public void setVersion(int version) {
44+
this.version = version;
45+
}
46+
47+
public String getNumber() {
48+
return number;
49+
}
50+
51+
public void setNumber(String number) {
52+
this.number = number;
53+
}
54+
55+
@ManyToOne(fetch = FetchType.LAZY)
56+
@JoinColumn(name = "voiceGroup", nullable = false)
57+
public VoiceGroup getVoiceGroup() {
58+
return voiceGroup;
59+
}
60+
61+
public void setVoiceGroup(VoiceGroup voiceGroup) {
62+
this.voiceGroup = voiceGroup;
63+
}
64+
65+
@ManyToOne(fetch = FetchType.LAZY)
66+
@JoinColumn(name = "provider", nullable = false)
67+
public Provider getProvider() {
68+
return provider;
69+
}
70+
71+
public void setProvider(Provider provider) {
72+
this.provider = provider;
73+
}
74+
75+
@Override
76+
public boolean equals(Object o) {
77+
if ( o instanceof TelephoneNumber telephoneNumber ) {
78+
return this == o || getId().equals( telephoneNumber.getId() );
79+
}
80+
else {
81+
return false;
82+
}
83+
}
84+
85+
@Override
86+
public int hashCode() {
87+
return Objects.hashCode( id );
88+
}
89+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.jpa.broken;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.FetchType;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.GenerationType;
11+
import jakarta.persistence.Id;
12+
import jakarta.persistence.JoinColumn;
13+
import jakarta.persistence.OneToOne;
14+
import jakarta.persistence.Version;
15+
import jakarta.validation.constraints.NotNull;
16+
17+
import java.io.Serializable;
18+
19+
@Entity
20+
public class ThirdParty implements Serializable {
21+
22+
private Integer id;
23+
private int version;
24+
private String name;
25+
private Provider provider;
26+
27+
@Id
28+
@GeneratedValue(strategy = GenerationType.IDENTITY)
29+
public Integer getId() {
30+
return id;
31+
}
32+
33+
public void setId(Integer id) {
34+
this.id = id;
35+
}
36+
37+
@Version
38+
public int getVersion() {
39+
return version;
40+
}
41+
42+
public void setVersion(int version) {
43+
this.version = version;
44+
}
45+
46+
@NotNull
47+
public String getName() {
48+
return name;
49+
}
50+
51+
public void setName(String name) {
52+
this.name = name;
53+
}
54+
55+
@OneToOne(fetch = FetchType.LAZY)
56+
@JoinColumn(name = "provider", nullable = true)
57+
public Provider getProvider() {
58+
return provider;
59+
}
60+
61+
public void setProvider(Provider provider) {
62+
this.provider = provider;
63+
}
64+
}

0 commit comments

Comments
 (0)