HHH-9663 added failing test case for Embeddable orphanRemoval

This commit is contained in:
Jaanus Hansen 2018-04-10 00:57:47 +03:00 committed by Christian Beikov
parent 9952c09843
commit 8101e3e47d
1 changed files with 184 additions and 0 deletions

View File

@ -0,0 +1,184 @@
/*
* 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 <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.test.jpa.orphan.one2one.embedded;
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
import org.junit.Assert;
import org.junit.Test;
import javax.persistence.*;
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
import static org.junit.Assert.assertNull;
/**
* Similar test as ../OneToOneLazyOrphanRemovalTest,
* shows that orphanRemoval = true is not removing the orphan of OneToOne relations in Embedded objects
* for unidirectional relationship.
*
* @TestForIssue( jiraKey = "HHH-9663" )
*/
public class OneToOneLazyOrphanRemovalInEmbeddedEntityTest extends BaseEntityManagerFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class<?>[] { RaceDriver.class, Car.class, Engine.class};
}
@Test
public void testOneToOneLazyOrphanRemoval() {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Initialize the data
doInJPA( this::entityManagerFactory, entityManager -> {
final Engine engine = new Engine( 1, 275 );
final Car car = new Car(1, engine, "red");
final RaceDriver raceDriver = new RaceDriver(1, car);
entityManager.persist( engine );
entityManager.persist( raceDriver );
} );
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//set car engine to null, orphanRemoval = true should trigger deletion for engine entity
doInJPA( this::entityManagerFactory, entityManager -> {
final RaceDriver raceDriver = entityManager.find( RaceDriver.class, 1 );
final Car car = raceDriver.getCar();
//check, that at the moment the engine is orphan
Assert.assertNotNull(car.getEngine());
car.setEngine( null );
entityManager.merge( raceDriver );
final RaceDriver raceDriver2 = entityManager.find( RaceDriver.class, 1 );
Assert.assertNotNull(raceDriver2.car);
} );
//check, that the engine is deleted:
doInJPA( this::entityManagerFactory, entityManager -> {
final RaceDriver raceDriver = entityManager.find( RaceDriver.class, 1 );
final Car car = raceDriver.getCar();
Assert.assertNull(car.getEngine());
final Engine engine = entityManager.find( Engine.class, 1 );
assertNull( engine);
} );
}
@Entity(name = "RaceDriver")
public static class RaceDriver {
@Id
private Integer id;
@Embedded
private Car car;
RaceDriver() {
// Required by JPA
}
RaceDriver(Integer id, Car car) {
this.id = id;
this.car = car;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
}
@Embeddable
public static class Car {
@Id
private Integer id;
// represents a unidirectional one-to-one
@OneToOne(orphanRemoval = true, fetch = FetchType.LAZY)
private Engine engine;
@Column
private String color;
Car() {
// Required by JPA
}
Car(Integer id, Engine engine, String color) {
this.id = id;
this.engine = engine;
this.color = color;
}
public Engine getEngine() {
return engine;
}
public void setEngine(Engine engine) {
this.engine = engine;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
@Entity(name = "Engine")
public static class Engine {
@Id
private Integer id;
private Integer horsePower;
Engine() {
// Required by JPA
}
Engine(Integer id, int horsePower) {
this.id = id;
this.horsePower = horsePower;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getHorsePower() {
return horsePower;
}
public void setHorsePower(Integer horsePower) {
this.horsePower = horsePower;
}
}
}