/*
* 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.schemaupdate;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.annotations.ForeignKey;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.tool.schema.internal.SchemaCreatorImpl;
import org.junit.Test;
import org.hibernate.testing.TestForIssue;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* @author Andrea Boriero
*/
@TestForIssue(jiraKey = "HHH-9865")
public class ImplicitCompositeKeyJoinTest {
private static final Logger LOGGER = Logger.getLogger( ImplicitCompositeKeyJoinTest.class );
@Test
public void testSchemaCreationSQLCommandIsGeneratedWithTheCorrectColumnSizeValues() throws Exception {
final StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().build();
try {
final org.hibernate.boot.Metadata metadata = new MetadataSources( ssr )
.addAnnotatedClass( Employee.class )
.buildMetadata();
boolean createTableEmployeeFound = false;
final List<String> commands = new SchemaCreatorImpl( ssr ).generateCreationCommands(
metadata,
false
);
for ( String command : commands ) {
LOGGER.info( command );
if ( command.toLowerCase().contains( "create table employee" ) ) {
final String[] columnsDefinition = getColumnsDefinition( command );
for ( int i = 0; i < columnsDefinition.length; i++ ) {
checkColumnSize( columnsDefinition[i] );
}
createTableEmployeeFound = true;
}
}
assertTrue(
"Expected create table command for Employee entity not found",
createTableEmployeeFound
);
}
finally {
StandardServiceRegistryBuilder.destroy( ssr );
}
}
private String[] getColumnsDefinition(String command) {
String substring = command.toLowerCase().replaceAll( "create table employee ", "" );
substring = substring.substring( 0, substring.toLowerCase().indexOf( "primary key" ) );
return substring.split( "\\," );
}
private void checkColumnSize(String s) {
if ( s.toLowerCase().contains( "manager_age" ) ) {
if ( !s.contains( "15" ) ) {
fail( expectedMessage( "manager_age", 15, s ) );
}
}
else if ( s.toLowerCase().contains( "manager_birthday" ) ) {
if ( !s.contains( "255" ) ) {
fail( expectedMessage( "manager_birthday", 255, s ) );
}
}
else if ( s.toLowerCase().contains( "manager_name" ) ) {
if ( !s.contains( "20" ) ) {
fail( expectedMessage( "manager_name", 20, s ) );
}
}
else if ( s.toLowerCase().contains( "age" ) ) {
if ( !s.contains( "15" ) ) {
fail( expectedMessage( "age", 15, s ) );
}
}
else if ( s.toLowerCase().contains( "birthday" ) ) {
if ( !s.contains( "255" ) ) {
fail( expectedMessage( "birthday", 255, s ) );
}
}
else if ( s.toLowerCase().contains( "name" ) ) {
if ( !s.contains( "20" ) ) {
fail( expectedMessage( "name", 20, s ) );
}
}
}
private String expectedMessage(String column_name, int size, String actual) {
return "Expected " + column_name + " " + size + " but was " + actual;
}
@Entity
@Table(name = "Employee")
public class Employee {
@EmbeddedId
@ForeignKey(name = "none")
private EmployeeId id;
@ManyToOne(optional = true)
@ForeignKey(name = "none")
private Employee manager;
}
@Embeddable
public class EmployeeId implements Serializable {
@Column(length = 15)
public String age;
@Column(length = 20)
private String name;
private String birthday;
}
}