Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ public AbstractCollectionPersister(
final BasicValue discriminatorDescriptor = any.getDiscriminatorDescriptor();
final AnyType anyType = any.getType();
final MetaType metaType = (MetaType) anyType.getDiscriminatorType();
final Object discriminatorValue = metaType.getEntityNameToDiscriminatorValueMap().get( ownerPersister.getEntityName() );
Object discriminatorValue = metaType.resolveDiscriminatorValue( ownerPersister.getEntityName() );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add the final back to match the rest of the code.

Suggested change
Object discriminatorValue = metaType.resolveDiscriminatorValue( ownerPersister.getEntityName() );
final Object discriminatorValue = metaType.resolveDiscriminatorValue( ownerPersister.getEntityName() );

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, as we discussed on Zulip, I think this shoud pass in the persister rather than "just" the name. That would open up the possibility for the other things we discussed (short name, etc).

final BasicType<Object> discriminatorBaseType = (BasicType<Object>) metaType.getBaseType();
final String discriminatorLiteral = discriminatorBaseType.getJdbcLiteralFormatter().toJdbcLiteral(
discriminatorValue,
Expand Down
11 changes: 11 additions & 0 deletions hibernate-core/src/main/java/org/hibernate/type/MetaType.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
Expand Down Expand Up @@ -59,6 +60,16 @@ public Map<String,Object> getEntityNameToDiscriminatorValueMap(){
return entityNameToDiscriminatorValueMap;
}

public Object resolveDiscriminatorValue(String entityName) {
return Optional.ofNullable(
getEntityNameToDiscriminatorValueMap().get( entityName ) ).orElse( entityName );
}

public String resolveEntityName(String discriminatorValue) {
return Optional.ofNullable(
getDiscriminatorValuesToEntityNameMap().get( discriminatorValue ) ).orElse( discriminatorValue );
}

public int[] getSqlTypeCodes(MappingContext mappingContext) throws MappingException {
return baseType.getSqlTypeCodes( mappingContext );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import org.hibernate.Session;
import org.hibernate.annotations.Any;
import org.hibernate.annotations.AnyDiscriminatorValue;
import org.hibernate.annotations.AnyKeyJavaClass;
import org.hibernate.cfg.JdbcSettings;

Expand Down Expand Up @@ -45,6 +44,7 @@
integrationSettings = @Setting(name = JdbcSettings.SHOW_SQL, value = "true")
)
@JiraKey("HHH-15722")
@JiraKey("HHH-18684")
class ManyToOneWithAnyTest {

@Test
Expand Down Expand Up @@ -117,8 +117,6 @@ public static class Book {

@Any
@AnyKeyJavaClass(Long.class)
@AnyDiscriminatorValue(entity = Shop.class, discriminator = "S")
@AnyDiscriminatorValue(entity = Library.class, discriminator = "L")
@Column(name = "STORE_ROLE")
@JoinColumn(name = "STORE_ID")
private Store store;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* SPDX-License-Identifier: LGPL-2.1-or-later
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.type;

import org.hibernate.testing.orm.junit.JiraKey;
import org.junit.jupiter.api.Test;

import java.util.HashMap;
import java.util.Map;

import static org.assertj.core.api.Assertions.assertThat;

/**
* Test {@link MetaType#resolveDiscriminatorValue(String)} and {@link MetaType#resolveEntityName(String)}
*
* @author Vincent Bouthinon
*/
@JiraKey("HHH-18684")
class MetaTypeResolveTest {

@Test
void resolveDiscriminatorValue_must_return_the_discriminator_value_when_the_entity_name_exist() {
// Given
Map<Object, String> discriminatorValuesToEntityNameMap = new HashMap<>();
discriminatorValuesToEntityNameMap.put( "dog", Dog.class.getCanonicalName() );
MetaType metaType = new MetaType( discriminatorValuesToEntityNameMap, null );
// When
Object discriminatorValue = metaType.resolveDiscriminatorValue( Dog.class.getCanonicalName() );
// Then
assertThat( discriminatorValue ).isEqualTo( "dog" );
}

@Test
void resolveDiscriminatorValue_must_return_the_entity_name_when_the_entity_name_dont_exist() {
// Given
Map<Object, String> discriminatorValuesToEntityNameMap = new HashMap<>();
discriminatorValuesToEntityNameMap.put( "anotherClass", MetaTypeResolveTest.class.getCanonicalName() );
MetaType metaType = new MetaType( discriminatorValuesToEntityNameMap, null );
// When
Object discriminatorValue = metaType.resolveDiscriminatorValue( Dog.class.getCanonicalName() );
// Then
assertThat( discriminatorValue ).isEqualTo( Dog.class.getCanonicalName() );
}

@Test
void resolveEntityName_must_return_the_entity_name_when_the_discriminator_value_exist() {
// Given
Map<Object, String> discriminatorValuesToEntityNameMap = new HashMap<>();
discriminatorValuesToEntityNameMap.put( "dog", Dog.class.getCanonicalName() );
MetaType metaType = new MetaType( discriminatorValuesToEntityNameMap, null );
// When
Object resolveEntityName = metaType.resolveEntityName( "dog" );
// Then
assertThat( resolveEntityName ).isEqualTo( Dog.class.getCanonicalName() );
}

@Test
void resolveEntityName_must_return_discriminator_value_when_the_entity_name_dont_exist() {
// Given
Map<Object, String> discriminatorValuesToEntityNameMap = new HashMap<>();
MetaType metaType = new MetaType( discriminatorValuesToEntityNameMap, null );
// When
Object resolveEntityName = metaType.resolveEntityName( Dog.class.getCanonicalName() );
// Then
assertThat( resolveEntityName ).isEqualTo( Dog.class.getCanonicalName() );
}

private static class Dog {
}
}