HHH-4160 Add test to check JPA compliance for deleting detached entities

This commit is contained in:
Christian Beikov 2025-01-03 14:16:07 +01:00
parent cfe4346ef8
commit 3d60bfa5f7
1 changed files with 99 additions and 0 deletions

View File

@ -0,0 +1,99 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.orm.test.deletedetached;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.JiraKey;
import org.hibernate.testing.orm.junit.Jpa;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@JiraKey("HHH-4160")
@Jpa(annotatedClasses = {
DeleteDetachedJpaComplianceTest.RestaurantWithCompositeKey.class,
DeleteDetachedJpaComplianceTest.Restaurant.class
})
public class DeleteDetachedJpaComplianceTest {
@Test
void testComposite(EntityManagerFactoryScope scope) {
RestaurantWithCompositeKey restaurant = new RestaurantWithCompositeKey();
restaurant.name = "Some stuff about the thing";
scope.inTransaction( s -> s.persist( restaurant ) );
scope.inTransaction( s -> {
RestaurantWithCompositeKey otherRestaurant = s.find(
RestaurantWithCompositeKey.class,
new RestaurantPK( restaurant.regionId, restaurant.restaurantId )
);
assertNotNull( otherRestaurant );
assertThrows(IllegalArgumentException.class,
() -> s.remove( restaurant ),
"Given entity is not associated with the persistence context"
);
} );
scope.inTransaction( s -> {
assertNotNull( s.find(
RestaurantWithCompositeKey.class,
new RestaurantPK( restaurant.regionId, restaurant.restaurantId )
) );
} );
}
@Test
void testRegular(EntityManagerFactoryScope scope) {
Restaurant restaurant = new Restaurant();
restaurant.name = "Some stuff about the thing";
scope.inTransaction( s -> s.persist( restaurant ) );
scope.inTransaction( s -> {
Restaurant otherRestaurant = s.find( Restaurant.class, restaurant.restaurantId );
assertNotNull( otherRestaurant );
assertThrows(IllegalArgumentException.class,
() -> s.remove( restaurant ),
"Given entity is not associated with the persistence context"
);
} );
scope.inTransaction( s -> {
assertNotNull( s.find( Restaurant.class, restaurant.restaurantId ) );
} );
}
@Entity
static class Restaurant {
@Id
@GeneratedValue
long restaurantId;
String name;
}
@Entity
@IdClass(value = RestaurantPK.class)
static class RestaurantWithCompositeKey {
@Id
@GeneratedValue
long regionId;
@Id
@GeneratedValue
long restaurantId;
String name;
}
static class RestaurantPK {
long regionId;
long restaurantId;
public RestaurantPK() {
}
public RestaurantPK(long regionId, long restaurantId) {
this.regionId = regionId;
this.restaurantId = restaurantId;
}
}
}