Skip to content

Commit 5675cbb

Browse files
karge-itestragavinking
authored andcommitted
HHH-14416 re-persisting removed child entities
1 parent 89fee1c commit 5675cbb

File tree

2 files changed

+234
-0
lines changed

2 files changed

+234
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
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.id;
6+
7+
import org.hibernate.cfg.AvailableSettings;
8+
import org.hibernate.cfg.Configuration;
9+
import org.hibernate.testing.orm.junit.JiraKey;
10+
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
11+
import org.junit.Test;
12+
13+
import jakarta.persistence.*;
14+
15+
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
16+
17+
public class ReSaveReferencedDeletedEntity extends BaseCoreFunctionalTestCase {
18+
@Override
19+
protected Class<?>[] getAnnotatedClasses() {
20+
return new Class<?>[] { Child.class, Parent.class };
21+
}
22+
23+
@Override
24+
protected void configure(Configuration configuration) {
25+
super.configure( configuration );
26+
configuration.setProperty( AvailableSettings.USE_IDENTIFIER_ROLLBACK, "true" );
27+
}
28+
29+
@Test
30+
@JiraKey("HHH-14416")
31+
public void testReSaveDeletedEntity() {
32+
doInHibernate( this::sessionFactory, session -> {
33+
Parent parent = new Parent();
34+
35+
Child child = new Child();
36+
parent.setChild( child );
37+
38+
session.persist( parent );
39+
40+
parent.setChild( null );
41+
session.remove(child);
42+
43+
session.flush();
44+
45+
parent.setChild( child );
46+
session.persist(child);
47+
} );
48+
}
49+
50+
@Test
51+
@JiraKey("HHH-14416")
52+
public void testReSaveDeletedEntityWithDetach() {
53+
doInHibernate( this::sessionFactory, session -> {
54+
Parent parent = new Parent();
55+
56+
Child child = new Child();
57+
parent.setChild( child );
58+
59+
session.persist( parent );
60+
61+
parent.setChild( null );
62+
session.remove(child);
63+
64+
session.flush();
65+
session.detach(child);
66+
67+
parent.setChild( child );
68+
session.persist(child);
69+
} );
70+
}
71+
72+
@Entity(name = "Child")
73+
public static class Child {
74+
@Id
75+
@GeneratedValue(strategy = GenerationType.IDENTITY)
76+
private Integer id;
77+
78+
public Integer getId() {
79+
return id;
80+
}
81+
82+
public void setId(Integer id) {
83+
this.id = id;
84+
}
85+
}
86+
87+
@Entity(name = "Parent")
88+
public static class Parent {
89+
@Id
90+
@GeneratedValue(strategy = GenerationType.IDENTITY)
91+
private Integer id;
92+
93+
@OneToOne(cascade = CascadeType.ALL)
94+
private Child child;
95+
96+
public Integer getId() {
97+
return id;
98+
}
99+
100+
public void setId(Integer id) {
101+
this.id = id;
102+
}
103+
104+
public Child getChild() {
105+
return child;
106+
}
107+
108+
public void setChild(Child child) {
109+
this.child = child;
110+
}
111+
}
112+
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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.id;
6+
7+
import org.hibernate.cfg.AvailableSettings;
8+
import org.hibernate.testing.orm.junit.JiraKey;
9+
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;
10+
import org.junit.Test;
11+
12+
import jakarta.persistence.*;
13+
14+
import java.util.Map;
15+
16+
public class ReSaveReferencedDeletedEntityJPA extends BaseEntityManagerFunctionalTestCase {
17+
@Override
18+
protected Class<?>[] getAnnotatedClasses() {
19+
return new Class<?>[] { Child.class, Parent.class };
20+
}
21+
22+
@Override
23+
protected Map<Object, Object> buildSettings() {
24+
Map<Object, Object> settings = super.buildSettings();
25+
settings.put( AvailableSettings.USE_IDENTIFIER_ROLLBACK, "true" );
26+
return settings;
27+
}
28+
29+
@Test
30+
@ JiraKey("HHH-14416")
31+
public void testRefreshUnDeletedEntityWithReferencesJPA() {
32+
EntityManager em = getOrCreateEntityManager();
33+
em.getTransaction().begin();
34+
35+
Parent parent = new Parent();
36+
parent.setId(1);
37+
38+
Child child = new Child();
39+
child.setId(2);
40+
parent.setChild( child );
41+
42+
em.persist( parent );
43+
44+
em.flush();
45+
46+
em.remove( parent );
47+
48+
em.flush();
49+
50+
em.detach( parent );
51+
52+
em.persist( parent );
53+
54+
em.flush();
55+
56+
em.refresh( child );
57+
58+
em.getTransaction().commit();
59+
}
60+
61+
@Test
62+
@JiraKey("HHH-14416")
63+
public void testReSaveDeletedEntityWithReferencesJPA() {
64+
EntityManager em = getOrCreateEntityManager();
65+
em.getTransaction().begin();
66+
67+
Parent parent = new Parent();
68+
parent.setId(1);
69+
70+
Child child = new Child();
71+
child.setId(2);
72+
parent.setChild( child );
73+
74+
em.persist( parent );
75+
76+
parent.setChild( null );
77+
em.remove( child );
78+
79+
em.persist( child );
80+
81+
em.getTransaction().commit();
82+
}
83+
84+
@Entity(name = "Child")
85+
public static class Child {
86+
@Id
87+
private Integer id;
88+
89+
public Integer getId() {
90+
return id;
91+
}
92+
93+
public void setId(Integer id) {
94+
this.id = id;
95+
}
96+
}
97+
98+
@Entity(name = "Parent")
99+
public static class Parent {
100+
@Id
101+
private Integer id;
102+
103+
@OneToOne(cascade = CascadeType.ALL)
104+
private Child child;
105+
106+
public Integer getId() {
107+
return id;
108+
}
109+
110+
public void setId(Integer id) {
111+
this.id = id;
112+
}
113+
114+
public Child getChild() {
115+
return child;
116+
}
117+
118+
public void setChild(Child child) {
119+
this.child = child;
120+
}
121+
}
122+
}

0 commit comments

Comments
 (0)