diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/Leaf.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/Leaf.java new file mode 100644 index 0000000000..e0fb72e258 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/Leaf.java @@ -0,0 +1,61 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.test.bytecode.enhancement.merge; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; + +/** + * @author Chris Cranford + */ +@Entity +@Access(AccessType.FIELD) +public class Leaf { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="LEAF_SEQ") + @SequenceGenerator(name = "LEAF_SEQ", sequenceName = "LEAF_SEQ") + private Long id; + + @ManyToOne(optional = false) + @JoinColumn(name = "ROOD_ID", nullable = false) + private Root root; + + @Column + private String name; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Root getRoot() { + return root; + } + + public void setRoot(Root root) { + this.root = root; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/MergeEnhancedDetachedOrphanRemovalTest.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/MergeEnhancedDetachedOrphanRemovalTest.java new file mode 100644 index 0000000000..86836ee81a --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/MergeEnhancedDetachedOrphanRemovalTest.java @@ -0,0 +1,43 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.test.bytecode.enhancement.merge; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; + +import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; + +/** + * @author Chris Cranford + */ +@TestForIssue(jiraKey = "HHH-12592") +@RunWith(BytecodeEnhancerRunner.class) +public class MergeEnhancedDetachedOrphanRemovalTest extends BaseCoreFunctionalTestCase { + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { Leaf.class, Root.class }; + } + + @Test + public void testMergeDetachedOrphanRemoval() { + final Root entity = doInHibernate( this::sessionFactory, session -> { + Root root = new Root(); + root.setName( "new" ); + session.save( root ); + return root; + } ); + + doInHibernate( this::sessionFactory, session -> { + entity.setName( "updated" ); + session.merge( entity ); + } ); + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/Root.java b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/Root.java new file mode 100644 index 0000000000..6b33486db9 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/bytecode/enhancement/merge/Root.java @@ -0,0 +1,61 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.test.bytecode.enhancement.merge; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; + +/** + * @author Chris Cranford + */ +@Entity +@Access(AccessType.PROPERTY) +public class Root { + private Long id; + private String name; + private Set leaves = new HashSet<>(); + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ROOT_SEQ") + @SequenceGenerator(name = "ROOT_SEQ", sequenceName = "ROOT_SEQ") + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + @Column(name = "NAME", length = 50) + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + public Set getLeaves() { + return leaves; + } + + public void setLeaves(Set leaves) { + this.leaves = leaves; + } +}