Skip to content

Commit

Permalink
Merge pull request #17600 from leonardowestphal/hibernate-discriminat…
Browse files Browse the repository at this point in the history
…or-ignore-explicit-for-joined

Add 'hibernate.discriminator.ignore_explicit_for_joined' property
  • Loading branch information
Sanne authored Jun 10, 2021
2 parents 7e28c83 + 6bb6aec commit 4ecac27
Show file tree
Hide file tree
Showing 16 changed files with 462 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,13 @@ public class HibernateOrmConfigPersistenceUnit {
@ConfigDocSection
public Map<String, HibernateOrmConfigPersistenceUnitCache> cache;

/**
* Discriminator related configuration.
*/
@ConfigItem
@ConfigDocSection
public HibernateOrmConfigPersistenceUnitDiscriminator discriminator;

/**
* The default in Quarkus is for 2nd level caching to be enabled,
* and a good implementation is already integrated for you.
Expand Down Expand Up @@ -216,7 +223,8 @@ public boolean isAnyPropertySet() {
!secondLevelCachingEnabled ||
multitenant.isPresent() ||
multitenantSchemaDatasource.isPresent() ||
fetch.isAnyPropertySet();
fetch.isAnyPropertySet() ||
discriminator.isAnyPropertySet();
}

@ConfigGroup
Expand Down Expand Up @@ -443,4 +451,24 @@ public boolean isAnyPropertySet() {
}

}

/**
* Discriminator configuration.
*
* Separated in a group configuration, in case it is necessary to add the another existing hibernate discriminator property.
*/
@ConfigGroup
public static class HibernateOrmConfigPersistenceUnitDiscriminator {
/**
* Existing applications rely (implicitly or explicitly) on Hibernate ignoring any DiscriminatorColumn declarations on
* joined inheritance hierarchies. This setting allows these applications to maintain the legacy behavior of
* DiscriminatorColumn annotations being ignored when paired with joined inheritance.
*/
@ConfigItem
public boolean ignoreExplicitForJoined;

public boolean isAnyPropertySet() {
return ignoreExplicitForJoined;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,10 @@ private static void producePersistenceUnitDescriptorFromConfig(
storageEngineCollector.add(persistenceUnitConfig.dialect.storageEngine.get());
}

// Discriminator Column
descriptor.getProperties().setProperty(AvailableSettings.IGNORE_EXPLICIT_DISCRIMINATOR_COLUMNS_FOR_JOINED_SUBCLASS,
String.valueOf(persistenceUnitConfig.discriminator.ignoreExplicitForJoined));

persistenceUnitDescriptors.produce(
new PersistenceUnitDescriptorBuildItem(descriptor, dataSource,
getMultiTenancyStrategy(persistenceUnitConfig.multitenant),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.MyEntity;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedDefaultValueTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(MyEntity.class)
.addAsResource("application-discriminator-ignore-explicit-for-joined-default-value.properties",
"application.properties"));

@Inject
EntityManager em;

@ActivateRequestContext
@Test
public void testDefaultValue() {
Map<String, Object> properties = em.getEntityManagerFactory().getProperties();
assertEquals("false", properties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.PersistenceUnit;
import io.quarkus.hibernate.orm.multiplepersistenceunits.model.config.inventory.Plane;
import io.quarkus.hibernate.orm.multiplepersistenceunits.model.config.user.User;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedDefaultValueWithMultiplePUsTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(User.class)
.addClass(Plane.class)
.addAsResource("application-multiple-pu-discriminator-ignore-explicit-for-joined-default-value.properties",
"application.properties"));
@PersistenceUnit("users")
@Inject
EntityManager emUsers;

@PersistenceUnit("inventory")
@Inject
EntityManager emInventory;

@ActivateRequestContext
@Test
public void testDefaultValue() {
Map<String, Object> usersProperties = emUsers.getEntityManagerFactory().getProperties();
assertEquals("false", usersProperties.get("hibernate.discriminator.ignore_explicit_for_joined"));

Map<String, Object> inventoryProperties = emUsers.getEntityManagerFactory().getProperties();
assertEquals("false", inventoryProperties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.xml.persistence.MyEntity;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedDefaultValueWithPersistenceXmlTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(MyEntity.class)
.addAsManifestResource("META-INF/persistence-discriminator-ignore-explicit-for-joined-default-value.xml",
"persistence.xml")
.addAsResource("application-datasource-only.properties", "application.properties"));

@Inject
EntityManager em;

@ActivateRequestContext
@Test
public void testDefaultNullValue() {
Map<String, Object> properties = em.getEntityManagerFactory().getProperties();

// the PU is templatePU from the persistence.xml, not the default entity manager from application.properties
assertEquals("templatePU", properties.get("hibernate.ejb.persistenceUnitName"));
//If not defined in persistence.xml, internally hibernate-orm will assume false as default value
assertEquals(null, properties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.xml.persistence.MyEntity;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedFalseValueWithPersistenceXmlTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(MyEntity.class)
.addAsManifestResource("META-INF/persistence-discriminator-ignore-explicit-for-joined-false-value.xml",
"persistence.xml")
.addAsResource("application-datasource-only.properties", "application.properties"));

@Inject
EntityManager em;

@ActivateRequestContext
@Test
public void testFalseValue() {
Map<String, Object> properties = em.getEntityManagerFactory().getProperties();

// the PU is templatePU from the persistence.xml, not the default entity manager from application.properties
assertEquals("templatePU", properties.get("hibernate.ejb.persistenceUnitName"));
assertEquals("false", properties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.MyEntity;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedTrueValueTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(MyEntity.class)
.addAsResource("application-discriminator-ignore-explicit-for-joined-true-value.properties",
"application.properties"));

@Inject
EntityManager em;

@ActivateRequestContext
@Test
public void testTrueValue() {
Map<String, Object> properties = em.getEntityManagerFactory().getProperties();
assertEquals("true", properties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.PersistenceUnit;
import io.quarkus.hibernate.orm.multiplepersistenceunits.model.config.inventory.Plane;
import io.quarkus.hibernate.orm.multiplepersistenceunits.model.config.user.User;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedTrueValueWithMultiplePUsTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(User.class)
.addClass(Plane.class)
.addAsResource("application-multiple-pu-discriminator-ignore-explicit-for-joined-true-value.properties",
"application.properties"));
@PersistenceUnit("users")
@Inject
EntityManager emUsers;

@PersistenceUnit("inventory")
@Inject
EntityManager emInventory;

@ActivateRequestContext
@Test
public void testTrueValue() {
Map<String, Object> usersProperties = emUsers.getEntityManagerFactory().getProperties();
assertEquals("true", usersProperties.get("hibernate.discriminator.ignore_explicit_for_joined"));

Map<String, Object> inventoryProperties = emUsers.getEntityManagerFactory().getProperties();
assertEquals("true", inventoryProperties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package io.quarkus.hibernate.orm.ignore_explicit_for_joined;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Map;

import javax.enterprise.context.control.ActivateRequestContext;
import javax.inject.Inject;
import javax.persistence.EntityManager;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.hibernate.orm.xml.persistence.MyEntity;
import io.quarkus.test.QuarkusUnitTest;

public class IgnoreExplicitForJoinedTrueValueWithPersistenceXmlTest {

@RegisterExtension
static QuarkusUnitTest runner = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClass(MyEntity.class)
.addAsManifestResource("META-INF/persistence-discriminator-ignore-explicit-for-joined-true-value.xml",
"persistence.xml")
.addAsResource("application-datasource-only.properties", "application.properties"));

@Inject
EntityManager em;

@ActivateRequestContext
@Test
public void testTrueValue() {
Map<String, Object> properties = em.getEntityManagerFactory().getProperties();

// the PU is templatePU from the persistence.xml, not the default entity manager from application.properties
assertEquals("templatePU", properties.get("hibernate.ejb.persistenceUnitName"));
assertEquals("true", properties.get("hibernate.discriminator.ignore_explicit_for_joined"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">

<persistence-unit name="templatePU" transaction-type="JTA">

<description>Hibernate test case template Persistence Unit</description>

<class>io.quarkus.hibernate.orm.xml.persistence.MyEntity</class>

<properties>
<!-- intentionally using worse case so that we can optimise for this -->
<property name="hibernate.archive.autodetection" value="class, hbm"/>

<!-- Connection specific -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>

<!--
Optimistically create the tables;
will cause background errors being logged if they already exist,
but is practical to retain existing data across runs (or create as needed) -->
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>

<property name="javax.persistence.validation.mode" value="NONE"/>
</properties>

</persistence-unit>
</persistence>
Loading

0 comments on commit 4ecac27

Please sign in to comment.