HHH-9663 added failing test case for Embeddable orphanRemoval
This commit is contained in:
parent
9952c09843
commit
8101e3e47d
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue