HHH-5732 - @OrderColumn not updated if @OneToMany has mappedby defined

This commit is contained in:
Steve Ebersole 2013-03-05 14:43:49 -06:00
parent 98c12081ec
commit 139474624f
4 changed files with 241 additions and 0 deletions

View File

@ -0,0 +1,87 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2013, 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.collection.list;
import java.math.BigDecimal;
/**
* @author Steve Ebersole
*/
public class LineItem {
private Integer id;
private Order order;
private String productCode;
private BigDecimal costPer;
private int quantity;
public LineItem() {
}
public LineItem(Order order, String productCode, int quantity, BigDecimal costPer) {
this.order = order;
this.productCode = productCode;
this.quantity = quantity;
this.costPer = costPer;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public String getProductCode() {
return productCode;
}
public void setProductCode(String productCode) {
this.productCode = productCode;
}
public BigDecimal getCostPer() {
return costPer;
}
public void setCostPer(BigDecimal costPer) {
this.costPer = costPer;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}

View File

@ -18,4 +18,26 @@
</list>
</class>
<class name="Order" table="T_ORDER">
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>
<property name="code" column="code" type="string"/>
<list name="lineItems" inverse="true" cascade="all">
<key column="order_id" />
<list-index column="INDX"/>
<one-to-many class="LineItem" />
</list>
</class>
<class name="LineItem" table="T_LINE_ITEM">
<id name="id" column="id" type="integer">
<generator class="increment"/>
</id>
<many-to-one name="order" class="Order" column="order_id" cascade="all"/>
<property name="productCode" column="PRD_CODE" type="string"/>
<property name="quantity" column="qty" type="integer"/>
<property name="costPer" column="cost_per" type="big_decimal"/>
</class>
</hibernate-mapping>

View File

@ -0,0 +1,74 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2013, 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.collection.list;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author Steve Ebersole
*/
public class Order {
private Integer id;
private String code;
private List<LineItem> lineItems = new ArrayList<LineItem>();
public Order() {
}
public Order(String code) {
this.code = code;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public List<LineItem> getLineItems() {
return lineItems;
}
public void setLineItems(List<LineItem> lineItems) {
this.lineItems = lineItems;
}
public LineItem addLineItem(String productCode, int quantity, BigDecimal costPer) {
LineItem lineItem = new LineItem( this, productCode, quantity, costPer );
lineItems.add( lineItem );
return lineItem;
}
}

View File

@ -27,6 +27,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@ -120,6 +121,63 @@ public class PersistentListTest extends BaseCoreFunctionalTestCase {
session2.close();
}
@Test
@TestForIssue( jiraKey = "HHH-5732" )
@FailureExpected( jiraKey = "HHH-5732" )
public void testInverseListIndexColumnWritten2() {
// make sure no one changes the mapping
final CollectionPersister collectionPersister = sessionFactory().getCollectionPersister( Order.class.getName() + ".lineItems" );
assertTrue( collectionPersister.isInverse() );
// do some creations...
Session session = openSession();
session.beginTransaction();
Order order = new Order( "acme-1" );
order.addLineItem( "abc", 2, new BigDecimal( 16.1 ) );
order.addLineItem( "def", 200, new BigDecimal( .01 ) );
order.addLineItem( "ghi", 13, new BigDecimal( 12.9 ) );
session.save( order );
session.getTransaction().commit();
session.close();
// now, make sure the list-index column gotten written...
final Session session2 = openSession();
session2.beginTransaction();
session2.doWork(
new Work() {
@Override
public void execute(Connection connection) throws SQLException {
final QueryableCollection queryableCollection = (QueryableCollection) collectionPersister;
SimpleSelect select = new SimpleSelect( getDialect() )
.setTableName( queryableCollection.getTableName() )
.addColumn( "ORDER_ID" )
.addColumn( "INDX" )
.addColumn( "PRD_CODE" );
PreparedStatement preparedStatement = ((SessionImplementor)session2).getTransactionCoordinator().getJdbcCoordinator().getStatementPreparer().prepareStatement( select.toStatementString() );
ResultSet resultSet = ((SessionImplementor)session2).getTransactionCoordinator().getJdbcCoordinator().getResultSetReturn().extract( preparedStatement );
Map<String, Integer> valueMap = new HashMap<String, Integer>();
while ( resultSet.next() ) {
final int fk = resultSet.getInt( 1 );
assertFalse( "Collection key (FK) column was null", resultSet.wasNull() );
final int indx = resultSet.getInt( 2 );
assertFalse( "List index column was null", resultSet.wasNull() );
final String prodCode = resultSet.getString( 3 );
assertFalse( "Prod code column was null", resultSet.wasNull() );
valueMap.put( prodCode, indx );
}
assertEquals( 3, valueMap.size() );
assertEquals( Integer.valueOf( 0 ), valueMap.get( "abc" ) );
assertEquals( Integer.valueOf( 1 ), valueMap.get( "def" ) );
assertEquals( Integer.valueOf( 2 ), valueMap.get( "ghi" ) );
}
}
);
session2.delete( order );
session2.getTransaction().commit();
session2.close();
}
@Test
public void testWriteMethodDirtying() {
ListOwner parent = new ListOwner( "root" );