HHH-10099 - @OrderColumn never generates the column in the schema
This commit is contained in:
parent
70c9c8e855
commit
a1444f2a10
|
@ -0,0 +1,187 @@
|
||||||
|
/*
|
||||||
|
* 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.list;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
|
import javax.persistence.OrderColumn;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
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.mapping.Collection;
|
||||||
|
import org.hibernate.mapping.Column;
|
||||||
|
import org.hibernate.tool.schema.internal.TargetStdoutImpl;
|
||||||
|
import org.hibernate.tool.schema.spi.SchemaManagementTool;
|
||||||
|
import org.hibernate.tool.schema.spi.Target;
|
||||||
|
|
||||||
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.equalTo;
|
||||||
|
import static org.hamcrest.CoreMatchers.instanceOf;
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Originally developed to help diagnose HHH-10099 which reports a problem with @OrderColumn
|
||||||
|
* not being bound
|
||||||
|
*
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class ListMappingTest extends BaseUnitTestCase {
|
||||||
|
private StandardServiceRegistry ssr;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void before() {
|
||||||
|
ssr = new StandardServiceRegistryBuilder()
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void after() {
|
||||||
|
if ( ssr != null ) {
|
||||||
|
StandardServiceRegistryBuilder.destroy( ssr );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOrderColumnInNormalBiDirectonalModel() {
|
||||||
|
Metadata metadata = new MetadataSources( ssr )
|
||||||
|
.addAnnotatedClass( Order.class )
|
||||||
|
.addAnnotatedClass( LineItem.class )
|
||||||
|
.buildMetadata();
|
||||||
|
|
||||||
|
Collection lineItemsBinding = metadata.getCollectionBindings().iterator().next();
|
||||||
|
|
||||||
|
// make sure it was interpreted as a List (aka, as having an OrderColumn at all)
|
||||||
|
assertThat( lineItemsBinding, instanceOf( org.hibernate.mapping.List.class ) );
|
||||||
|
org.hibernate.mapping.List asList = (org.hibernate.mapping.List) lineItemsBinding;
|
||||||
|
|
||||||
|
// assert the OrderColumn details
|
||||||
|
final Column positionColumn = (Column) asList.getIndex().getColumnIterator().next();
|
||||||
|
assertThat( positionColumn.getName(), equalTo( "position" ) );
|
||||||
|
|
||||||
|
// make sure the OrderColumn is part of the collection table
|
||||||
|
assertTrue( asList.getCollectionTable().containsColumn( positionColumn ) );
|
||||||
|
|
||||||
|
class TargetImpl extends TargetStdoutImpl {
|
||||||
|
boolean found = false;
|
||||||
|
@Override
|
||||||
|
public void accept(String action) {
|
||||||
|
super.accept( action );
|
||||||
|
if ( action.startsWith( "create table t_line_item" ) ) {
|
||||||
|
if ( action.contains( "position" ) ) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TargetImpl target = new TargetImpl();
|
||||||
|
|
||||||
|
ssr.getService( SchemaManagementTool.class ).getSchemaCreator( Collections.emptyMap() ).doCreation(
|
||||||
|
metadata,
|
||||||
|
true,
|
||||||
|
Collections.<Target>singletonList( target )
|
||||||
|
);
|
||||||
|
|
||||||
|
assertTrue( target.found );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
// Bi-directional model
|
||||||
|
|
||||||
|
@Entity( name = "Order" )
|
||||||
|
@Table( name = "t_order" )
|
||||||
|
public static class Order {
|
||||||
|
private Integer id;
|
||||||
|
private List<LineItem> lineItems = new ArrayList<LineItem>();
|
||||||
|
|
||||||
|
@Id
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OneToMany( mappedBy = "order" )
|
||||||
|
@OrderColumn( name = "position" )
|
||||||
|
public List<LineItem> getLineItems() {
|
||||||
|
return lineItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLineItems(List<LineItem> lineItems) {
|
||||||
|
this.lineItems = lineItems;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Entity( name = "LineItem" )
|
||||||
|
@Table( name = "t_line_item" )
|
||||||
|
public static class LineItem {
|
||||||
|
private Integer id;
|
||||||
|
private Order order;
|
||||||
|
private String product;
|
||||||
|
private int quantity;
|
||||||
|
private String discountCode;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToOne( optional = false )
|
||||||
|
@JoinColumn( name = "order_id" )
|
||||||
|
public Order getOrder() {
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOrder(Order order) {
|
||||||
|
this.order = order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProduct() {
|
||||||
|
return product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProduct(String product) {
|
||||||
|
this.product = product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getQuantity() {
|
||||||
|
return quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setQuantity(int quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDiscountCode() {
|
||||||
|
return discountCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiscountCode(String discountCode) {
|
||||||
|
this.discountCode = discountCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue