/*
* 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.uniqueconstraint;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.hibernate.AnnotationException;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseUnitTestCase;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* @author Steve Ebersole
*/
public class UniqueConstraintUnitTests extends BaseUnitTestCase {
@Test
@TestForIssue( jiraKey = "HHH-8026" )
public void testUnNamedConstraints() {
StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build();
try {
final Metadata metadata = new MetadataSources( ssr )
.addAnnotatedClass( UniqueNoNameA.class )
.addAnnotatedClass( UniqueNoNameB.class )
.buildMetadata();
org.hibernate.mapping.Table tableA = null;
org.hibernate.mapping.Table tableB = null;
for ( org.hibernate.mapping.Table table : metadata.collectTableMappings() ) {
if ( table.getName().equals( "UniqueNoNameA" ) ) {
tableA = table;
}
else if ( table.getName().equals( "UniqueNoNameB" ) ) {
tableB = table;
}
}
assertTrue( "Could not find the expected tables.", tableA != null && tableB != null );
assertFalse(
tableA.getUniqueKeyIterator().next().getName().equals(
tableB.getUniqueKeyIterator().next().getName()
)
);
}
finally {
StandardServiceRegistryBuilder.destroy( ssr );
}
}
@Test
@TestForIssue( jiraKey = "HHH-8537" )
public void testNonExistentColumn() {
StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build();
try {
final Metadata metadata = new MetadataSources( ssr )
.addAnnotatedClass( UniqueNoNameA.class )
.addAnnotatedClass( UniqueNoNameB.class )
.buildMetadata();
}
catch (NullPointerException e) {
fail( "The @UniqueConstraint with a non-existent column name should have resulted in an AnnotationException" );
}
catch (AnnotationException e) {
// expected
}
finally {
StandardServiceRegistryBuilder.destroy( ssr );
}
}
@Entity
@Table( name = "UniqueNoNameA",
uniqueConstraints = {@UniqueConstraint(columnNames={"name"})})
public static class UniqueNoNameA {
@Id
@GeneratedValue
public long id;
public String name;
}
@Entity
@Table( name = "UniqueNoNameB",
uniqueConstraints = {@UniqueConstraint(columnNames={"name"})})
public static class UniqueNoNameB {
@Id
@GeneratedValue
public long id;
public String name;
}
@Entity
public static class UniqueColumnDoesNotExist {
@Id
public Integer id;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(
name = "tbl_strings",
joinColumns = @JoinColumn(name = "fk", nullable = false),
// the failure required at least 1 columnName to be correct -- all incorrect wouldn't reproduce
uniqueConstraints = @UniqueConstraint(columnNames = { "fk", "doesnotexist" })
)
@Column(name = "string", nullable = false)
public Set<String> strings = new HashSet<String>();
}
}