HHH-16474 issue reproducer
This commit is contained in:
parent
b971b1e377
commit
7223a5eb53
|
@ -0,0 +1,268 @@
|
|||
package org.hibernate.orm.test.bytecode.enhancement.cache;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.annotations.BatchSize;
|
||||
import org.hibernate.annotations.Cache;
|
||||
import org.hibernate.annotations.CacheConcurrencyStrategy;
|
||||
import org.hibernate.annotations.Fetch;
|
||||
import org.hibernate.annotations.FetchMode;
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
import org.hibernate.cfg.Configuration;
|
||||
|
||||
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.hibernate.testing.orm.junit.JiraKey;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import jakarta.persistence.Cacheable;
|
||||
import jakarta.persistence.DiscriminatorColumn;
|
||||
import jakarta.persistence.DiscriminatorType;
|
||||
import jakarta.persistence.DiscriminatorValue;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Inheritance;
|
||||
import jakarta.persistence.InheritanceType;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.ManyToOne;
|
||||
import jakarta.persistence.OneToMany;
|
||||
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||
|
||||
|
||||
@RunWith(BytecodeEnhancerRunner.class)
|
||||
@JiraKey("HHH-16744")
|
||||
public class ManyToOneTestReusedColumn extends BaseCoreFunctionalTestCase {
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class[] {
|
||||
Fridge.class,
|
||||
Container.class,
|
||||
CheeseContainer.class,
|
||||
FruitContainer.class,
|
||||
Food.class,
|
||||
Fruit.class,
|
||||
Cheese.class
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure(Configuration configuration) {
|
||||
configuration.setProperty( AvailableSettings.USE_SECOND_LEVEL_CACHE, "true" );
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
inTransaction(
|
||||
session -> {
|
||||
Fridge fridge = new Fridge();
|
||||
FruitContainer fruitContainer = new FruitContainer();
|
||||
CheeseContainer cheeseContainer = new CheeseContainer();
|
||||
|
||||
Fruit fruit = new Fruit();
|
||||
Cheese cheese = new Cheese();
|
||||
|
||||
Fruit otherFruit = new Fruit();
|
||||
Cheese otherCheese = new Cheese();
|
||||
|
||||
fruit.bestPairedWith = otherFruit;
|
||||
cheese.bestPairedWith = otherCheese;
|
||||
|
||||
fruitContainer.fruit = fruit;
|
||||
cheeseContainer.cheese = cheese;
|
||||
|
||||
fridge.addToFridge( fruitContainer );
|
||||
fridge.addToFridge( cheeseContainer );
|
||||
|
||||
session.persist( fridge );
|
||||
session.persist( otherFruit );
|
||||
session.persist( otherCheese );
|
||||
session.persist( fruit );
|
||||
session.persist( cheese );
|
||||
session.persist( fruitContainer );
|
||||
session.persist( cheeseContainer );
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSelect() {
|
||||
inTransaction(
|
||||
session -> {
|
||||
Fridge fridge = session.getReference( Fridge.class, 1 );
|
||||
|
||||
for ( Container container : fridge.getContainers() ) {
|
||||
if ( container instanceof FruitContainer ) {
|
||||
Fruit f = ( (FruitContainer) container ).getFruit();
|
||||
assertThat( f.toString() ).isNotNull();
|
||||
assertThat( f.getBestPairedWith() ).isNotNull();
|
||||
}
|
||||
else if ( container instanceof CheeseContainer ) {
|
||||
Cheese c = ( (CheeseContainer) container ).getCheese();
|
||||
assertThat( c.toString() ).isNotNull();
|
||||
assertThat( c.getBestPairedWith() ).isNotNull();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Entity
|
||||
@Cacheable
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
public static class Fridge {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
@OneToMany(mappedBy = "fridge")
|
||||
private Set<Container> containers = new HashSet<>();
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Set<Container> getContainers() {
|
||||
return containers;
|
||||
}
|
||||
|
||||
public void setContainers(Set<Container> containers) {
|
||||
this.containers = containers;
|
||||
}
|
||||
|
||||
public void addToFridge(Container container) {
|
||||
container.setFridge( this );
|
||||
containers.add( container );
|
||||
}
|
||||
}
|
||||
|
||||
@Entity
|
||||
@BatchSize(size = 500)
|
||||
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
|
||||
@Cacheable
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type")
|
||||
@DiscriminatorValue(value = "CONTAINER")
|
||||
public static class Container {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
@ManyToOne
|
||||
private Fridge fridge;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Fridge getFridge() {
|
||||
return fridge;
|
||||
}
|
||||
|
||||
public void setFridge(Fridge fridge) {
|
||||
this.fridge = fridge;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity
|
||||
@DiscriminatorValue(value = "FRUIT_CONTAINER")
|
||||
public static class FruitContainer extends Container {
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "food_id")
|
||||
@Fetch(FetchMode.SELECT)
|
||||
private Fruit fruit;
|
||||
|
||||
public Fruit getFruit() {
|
||||
return fruit;
|
||||
}
|
||||
|
||||
public void setFruit(Fruit fruit) {
|
||||
this.fruit = fruit;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity
|
||||
@DiscriminatorValue(value = "CHEESE_CONTAINER")
|
||||
public static class CheeseContainer extends Container {
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "food_id")
|
||||
@Fetch(FetchMode.SELECT)
|
||||
private Cheese cheese;
|
||||
|
||||
public Cheese getCheese() {
|
||||
return cheese;
|
||||
}
|
||||
|
||||
public void setCheese(Cheese cheese) {
|
||||
this.cheese = cheese;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity
|
||||
@BatchSize(size = 500)
|
||||
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
|
||||
@Cacheable
|
||||
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
|
||||
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type")
|
||||
@DiscriminatorValue(value = "FOOD")
|
||||
public static class Food {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Long id;
|
||||
|
||||
public Long getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity
|
||||
@BatchSize(size = 500)
|
||||
@DiscriminatorValue(value = "FRUIT")
|
||||
public static class Fruit extends Food {
|
||||
@ManyToOne
|
||||
@Fetch(FetchMode.SELECT)
|
||||
private Fruit bestPairedWith;
|
||||
|
||||
public Fruit getBestPairedWith() {
|
||||
return bestPairedWith;
|
||||
}
|
||||
|
||||
public void setBestPairedWith(Fruit bestPairedWith) {
|
||||
this.bestPairedWith = bestPairedWith;
|
||||
}
|
||||
}
|
||||
|
||||
@Entity
|
||||
@BatchSize(size = 500)
|
||||
@DiscriminatorValue(value = "CHEESE")
|
||||
public static class Cheese extends Food {
|
||||
@ManyToOne
|
||||
@Fetch(FetchMode.SELECT)
|
||||
private Cheese bestPairedWith;
|
||||
|
||||
public Cheese getBestPairedWith() {
|
||||
return bestPairedWith;
|
||||
}
|
||||
|
||||
public void setBestPairedWith(Cheese bestPairedWith) {
|
||||
this.bestPairedWith = bestPairedWith;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue