/* * 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.constraint; import java.util.Iterator; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.mapping.Column; import org.hibernate.mapping.ForeignKey; import org.hibernate.mapping.UniqueKey; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @author Brett Meyer */ public class ConstraintTest extends BaseNonConfigCoreFunctionalTestCase { private static final int MAX_NAME_LENGTH = 30; private static final String EXPLICIT_FK_NAME_NATIVE = "fk_explicit_native"; private static final String EXPLICIT_FK_NAME_JPA = "fk_explicit_jpa"; private static final String EXPLICIT_UK_NAME = "uk_explicit"; @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { DataPoint.class, DataPoint2.class }; } @Test @TestForIssue( jiraKey = "HHH-7797" ) public void testUniqueConstraints() { Column column = (Column) metadata().getEntityBinding( DataPoint.class.getName() ) .getProperty( "foo1" ).getColumnIterator().next(); assertFalse( column.isNullable() ); assertTrue( column.isUnique() ); column = (Column) metadata().getEntityBinding( DataPoint.class.getName() ) .getProperty( "foo2" ).getColumnIterator().next(); assertTrue( column.isNullable() ); assertTrue( column.isUnique() ); column = (Column) metadata().getEntityBinding( DataPoint.class.getName() ) .getProperty( "id" ).getColumnIterator().next(); assertFalse( column.isNullable() ); assertTrue( column.isUnique() ); } @Test @TestForIssue( jiraKey = "HHH-1904" ) public void testConstraintNameLength() { int foundCount = 0; for ( Namespace namespace : metadata().getDatabase().getNamespaces() ) { for ( org.hibernate.mapping.Table table : namespace.getTables() ) { Iterator fkItr = table.getForeignKeyIterator(); while (fkItr.hasNext()) { ForeignKey fk = (ForeignKey) fkItr.next(); assertTrue( fk.getName().length() <= MAX_NAME_LENGTH ); // ensure the randomly generated constraint name doesn't // happen if explicitly given Column column = fk.getColumn( 0 ); if ( column.getName().equals( "explicit_native" ) ) { foundCount++; assertEquals( fk.getName(), EXPLICIT_FK_NAME_NATIVE ); } else if ( column.getName().equals( "explicit_jpa" ) ) { foundCount++; assertEquals( fk.getName(), EXPLICIT_FK_NAME_JPA ); } } Iterator ukItr = table.getUniqueKeyIterator(); while (ukItr.hasNext()) { UniqueKey uk = (UniqueKey) ukItr.next(); assertTrue( uk.getName().length() <= MAX_NAME_LENGTH ); // ensure the randomly generated constraint name doesn't // happen if explicitly given Column column = uk.getColumn( 0 ); if ( column.getName().equals( "explicit" ) ) { foundCount++; assertEquals( uk.getName(), EXPLICIT_UK_NAME ); } } } } assertEquals("Could not find the necessary columns.", 3, foundCount); } @Entity @Table( name = "DataPoint", uniqueConstraints = { @UniqueConstraint( name = EXPLICIT_UK_NAME, columnNames = { "explicit" } ) } ) public static class DataPoint { @Id @GeneratedValue @javax.persistence.Column( nullable = false, unique = true) public long id; @javax.persistence.Column( nullable = false, unique = true) public String foo1; @javax.persistence.Column( nullable = true, unique = true) public String foo2; public String explicit; } @Entity @Table( name = "DataPoint2" ) public static class DataPoint2 { @Id @GeneratedValue public long id; @OneToOne public DataPoint dp; @OneToOne @org.hibernate.annotations.ForeignKey(name = EXPLICIT_FK_NAME_NATIVE) @JoinColumn(name = "explicit_native") public DataPoint explicit_native; @OneToOne @JoinColumn(name = "explicit_jpa", foreignKey = @javax.persistence.ForeignKey(name = EXPLICIT_FK_NAME_JPA)) public DataPoint explicit_jpa; } }