diff --git a/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java b/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java new file mode 100644 index 0000000000..347219e955 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/namingstrategy/collectionJoinTableNaming/CollectionJoinTableNamingTest.java @@ -0,0 +1,135 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2015, Red Hat Inc. or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Inc. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + */ +package org.hibernate.test.namingstrategy.collectionJoinTableNaming; + +import java.io.Serializable; +import java.util.List; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.OrderColumn; +import javax.persistence.Table; + +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.EJB3NamingStrategy; +import org.hibernate.cfg.ImprovedNamingStrategy; +import org.hibernate.mapping.Collection; +import org.hibernate.mapping.Column; +import org.hibernate.tool.hbm2ddl.SchemaExport; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseUnitTestCase; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +/** + * @author Steve Ebersole + * @author Alessandro Polverini + */ +public class CollectionJoinTableNamingTest extends BaseUnitTestCase { + @Test + @TestForIssue( jiraKey = "HHH-9908" ) + public void testCollectionJoinTableNamingLegacyStrategy() { + Configuration cfg = new Configuration(); + cfg.setNamingStrategy( ImprovedNamingStrategy.INSTANCE ); + + cfg.addAnnotatedClass( Input.class ); + cfg.addAnnotatedClass( Ptx.class ); + cfg.buildMappings(); + + Collection inputs1Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs1" ); + assertEquals( "ptx_inputs1", inputs1Mapping.getCollectionTable().getName() ); + + Collection inputs2Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs2" ); + assertEquals( "ptx_inputs2", inputs2Mapping.getCollectionTable().getName() ); + } + + @Test + @TestForIssue( jiraKey = "HHH-9908" ) + public void testCollectionJoinTableNamingJpaCompliantStrategy() { + // Even in 4.3, with JPA compliant naming, Hibernate creates an unusable table... + + Configuration cfg = new Configuration(); + cfg.setNamingStrategy( EJB3NamingStrategy.INSTANCE ); + + cfg.addAnnotatedClass( Input.class ); + cfg.addAnnotatedClass( Ptx.class ); + cfg.buildMappings(); + + Collection inputs1Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs1" ); + assertEquals( "ptx_input", inputs1Mapping.getCollectionTable().getName() ); + + Collection inputs2Mapping = cfg.getCollectionMapping( Ptx.class.getName() + ".inputs2" ); + assertEquals( "ptx_input", inputs2Mapping.getCollectionTable().getName() ); + + assertSame( inputs1Mapping.getCollectionTable(), inputs2Mapping.getCollectionTable() ); + + new SchemaExport( cfg ).create( true, false ); + + for ( int i = 0; i < inputs1Mapping.getCollectionTable().getColumnSpan(); i++ ) { + final Column column = inputs1Mapping.getCollectionTable().getColumn( i ); + + // this, coupled with JPA saying the 2 collections implicitly map to the same table, + // is the crux of the problem: all columns are null, so we effectively can never + // insert rows into it. + assertFalse( column.isNullable() ); + } + } + + @Entity + @Table(name = "ptx") + public static class Ptx { + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "increment") + @GenericGenerator(name = "increment", strategy = "increment") + private Integer id; + + @OrderColumn + @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER) + private List inputs1; + + @OrderColumn + @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST}, fetch = FetchType.EAGER) + private List inputs2; + + } + + @Entity + @Table(name = "input") + public class Input implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "increment") + @GenericGenerator(name = "increment", strategy = "increment") + private Integer id; + } +}