/* * 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.annotations.collectionelement; import org.hibernate.boot.MetadataBuilder; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.ImplicitCollectionTableNameSource; import org.hibernate.boot.model.naming.ImplicitJoinColumnNameSource; import org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl; import org.hibernate.testing.TestForIssue; import org.junit.Test; /** * @author Gail Badner */ public class CustomImprovedNamingCollectionElementTest extends ImprovedNamingCollectionElementTest { @Override protected void configureMetadataBuilder(MetadataBuilder metadataBuilder) { super.configureMetadataBuilder( metadataBuilder ); metadataBuilder.applyImplicitNamingStrategy( new MyImprovedNamingStrategy() ); } @Test @TestForIssue( jiraKey = "HHH-9387") public void testDefaultTableNameOwnerEntityNameAndPKColumnOverride() { // NOTE: expected JPA entity names are explicit here (rather than just getting them from the PersistentClass) // to ensure that entity names/tables are not changed (which would invalidate these test cases). // Matrix has @Entity(name="Mtx"); entity table name defaults to "Mtx"; owner PK column is configured as "mId" // MyNamingStrategyDelegator will use the owner primary table name (instead of JPA entity name) in generated collection table. checkDefaultCollectionTableName( Matrix.class, "mvalues", "Mtx_mvalues" ); } @Test @TestForIssue( jiraKey = "HHH-9387") public void testDefaultTableNameOwnerPrimaryTableAndEntityNamesOverride() { // NOTE: expected JPA entity names are explicit here (rather than just getting them from the PersistentClass) // to ensure that entity names/tables are not changed (which would invalidate these test cases). // Owner has @Entity( name="OWNER") @Table( name="OWNER_TABLE") // MyNamingStrategyDelegator will use owner primary table name (instead of JPA entity name) in generated collection table. checkDefaultCollectionTableName( Owner.class, "elements", "OWNER_TABLE_elements" ); } @Test @TestForIssue( jiraKey = "HHH-9389") public void testDefaultJoinColumnOwnerEntityNameAndPKColumnOverride() { // NOTE: expected JPA entity names are explicit here (rather than just getting them from the PersistentClass) // to ensure that entity names/tables are not changed (which would invalidate these test cases). // Matrix has @Entity(name="Mtx"); entity table name defaults to "Mtx"; owner PK column is configured as "mId" // MyNamingStrategyDelegator will use owner primary table name, which will default to the JPA entity name // in generated join column. checkDefaultJoinColumnName( Matrix.class, "mvalues", "Mtx_mId" ); } @Test @TestForIssue( jiraKey = "HHH-9389") public void testDefaultJoinColumnOwnerPrimaryTableAndEntityNamesOverride() { // NOTE: expected JPA entity names are explicit here (rather than just getting them from the PersistentClass) // to ensure that entity names/tables are not changed (which would invalidate these test cases). // Owner has @Entity( name="OWNER") @Table( name="OWNER_TABLE") // MyNamingStrategyDelegator will use the table name (instead of JPA entity name) in generated join column. checkDefaultJoinColumnName( Owner.class, "elements", "OWNER_TABLE_id" ); } @Test @TestForIssue( jiraKey = "HHH-9389") public void testDefaultJoinColumnOwnerPrimaryTableOverride() { // NOTE: expected JPA entity names are explicit here (rather than just getting them from the PersistentClass) // to ensure that entity names/tables are not changed (which would invalidate these test cases). // Boy has @Entity @Table(name="tbl_Boys") // MyNamingStrategyDelegator will use the table name (instead of JPA entity name) in generated join column. checkDefaultJoinColumnName( Boy.class, "hatedNames", "tbl_Boys_id" ); } @Test @TestForIssue( jiraKey = "HHH-9387") public void testDefaultTableNameOwnerPrimaryTableOverride() { // NOTE: expected JPA entity names are explicit here (rather than just getting them from the PersistentClass) // to ensure that entity names/tables are not changed (which would invalidate these test cases). // Boy has @Entity @Table(name="tbl_Boys") // MyNamingStrategyDelegator will use the table name (instead of JPA entity name) in generated join column. checkDefaultCollectionTableName( Boy.class, "hatedNames", "tbl_Boys_hatedNames" ); } static class MyImprovedNamingStrategy extends ImplicitNamingStrategyJpaCompliantImpl { @Override public Identifier determineCollectionTableName(ImplicitCollectionTableNameSource source) { // This impl uses the owner entity table name instead of the JPA entity name when // generating the implicit name. final String name = source.getOwningPhysicalTableName().getText() + '_' + transformAttributePath( source.getOwningAttributePath() ); return toIdentifier( name, source.getBuildingContext() ); } @Override public Identifier determineJoinColumnName(ImplicitJoinColumnNameSource source) { final String name = source.getReferencedTableName() + "_" + source.getReferencedColumnName(); return toIdentifier( name, source.getBuildingContext() ); } } }