diff --git a/src/test/java/org/tests/inheritance/TestInheritanceOrderColumn.java b/src/test/java/org/tests/inheritance/TestInheritanceOrderColumn.java new file mode 100644 index 000000000..e5a8f0141 --- /dev/null +++ b/src/test/java/org/tests/inheritance/TestInheritanceOrderColumn.java @@ -0,0 +1,68 @@ +package org.tests.inheritance; + +import io.ebean.BaseTestCase; +import io.ebean.Ebean; +import io.ebeantest.LoggedSql; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Test; +import org.tests.inheritance.order.OrderMasterInheritance; +import org.tests.inheritance.order.OrderedA; +import org.tests.inheritance.order.OrderedB; +import org.tests.inheritance.order.OrderedParent; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TestInheritanceOrderColumn extends BaseTestCase { + + @Test + public void test() { + final OrderMasterInheritance master = new OrderMasterInheritance(); + final OrderedA orderedA = new OrderedA(); + orderedA.setCommonName("commonOrderedA"); + orderedA.setOrderedAName("orderedA"); + + final OrderedB orderedB = new OrderedB(); + orderedB.setCommonName("commonOrderedB"); + orderedB.setOrderedBName("orderedB"); + + master.getReferenced().add(orderedA); + master.getReferenced().add(orderedB); + + LoggedSqlCollector.start(); + Ebean.save(master); + List sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(5); + // Some platforms insert ids and others don't need to... + assertSql(sql.get(1)) + .matches( + "txn\\[] insert into ordered_parent \\((id, )?order_master_inheritance_id, dtype, common_name, ordered_aname, sort_order\\).*"); + assertSql(sql.get(3)) + .matches( + "txn\\[] insert into ordered_parent \\((id, )?order_master_inheritance_id, dtype, common_name, ordered_bname, sort_order\\).*"); + + OrderMasterInheritance result = Ebean.find(OrderMasterInheritance.class).findOne(); + assertThat(result.getReferenced()) + .extracting(OrderedParent::getCommonName) + .containsExactly("commonOrderedA", "commonOrderedB"); + + // Swap the two + result.getReferenced().add(0, result.getReferenced().remove(1)); + assertThat(result.getReferenced()) + .extracting(OrderedParent::getCommonName) + .containsExactly("commonOrderedB", "commonOrderedA"); + + LoggedSql.start(); + Ebean.save(result); + sql = LoggedSqlCollector.stop(); + assertThat(sql).hasSize(3); + assertThat(sql.get(0)).contains("update ordered_parent set sort_order=? where id=?"); + + result = Ebean.find(OrderMasterInheritance.class).findOne(); + assertThat(result.getReferenced()) + .extracting(OrderedParent::getCommonName) + .containsExactly("commonOrderedB", "commonOrderedA"); + } + +} diff --git a/src/test/java/org/tests/inheritance/order/OrderMasterInheritance.java b/src/test/java/org/tests/inheritance/order/OrderMasterInheritance.java new file mode 100644 index 000000000..408d764ff --- /dev/null +++ b/src/test/java/org/tests/inheritance/order/OrderMasterInheritance.java @@ -0,0 +1,36 @@ +package org.tests.inheritance.order; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OrderColumn; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class OrderMasterInheritance { + + @Id + Integer id; + + @OneToMany(cascade = CascadeType.ALL) + @OrderColumn(name = "sort_order") + List referenced = new ArrayList<>(); + + public Integer getId() { + return id; + } + + public void setId(final Integer id) { + this.id = id; + } + + public List getReferenced() { + return referenced; + } + + public void setReferenced(final List referenced) { + this.referenced = referenced; + } +} diff --git a/src/test/java/org/tests/inheritance/order/OrderedA.java b/src/test/java/org/tests/inheritance/order/OrderedA.java new file mode 100644 index 000000000..036ceccf8 --- /dev/null +++ b/src/test/java/org/tests/inheritance/order/OrderedA.java @@ -0,0 +1,17 @@ +package org.tests.inheritance.order; + +import javax.persistence.Entity; + +@Entity +public class OrderedA extends OrderedParent { + + String orderedAName; + + public String getOrderedAName() { + return orderedAName; + } + + public void setOrderedAName(final String orderedAName) { + this.orderedAName = orderedAName; + } +} diff --git a/src/test/java/org/tests/inheritance/order/OrderedB.java b/src/test/java/org/tests/inheritance/order/OrderedB.java new file mode 100644 index 000000000..d21a708e4 --- /dev/null +++ b/src/test/java/org/tests/inheritance/order/OrderedB.java @@ -0,0 +1,17 @@ +package org.tests.inheritance.order; + +import javax.persistence.Entity; + +@Entity +public class OrderedB extends OrderedParent { + + String orderedBName; + + public String getOrderedBName() { + return orderedBName; + } + + public void setOrderedBName(final String orderedBName) { + this.orderedBName = orderedBName; + } +} diff --git a/src/test/java/org/tests/inheritance/order/OrderedParent.java b/src/test/java/org/tests/inheritance/order/OrderedParent.java new file mode 100644 index 000000000..43845541c --- /dev/null +++ b/src/test/java/org/tests/inheritance/order/OrderedParent.java @@ -0,0 +1,31 @@ +package org.tests.inheritance.order; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; + +@Entity +@Inheritance +public abstract class OrderedParent { + + @Id + Integer id; + + String commonName; + + public Integer getId() { + return id; + } + + public void setId(final Integer id) { + this.id = id; + } + + public String getCommonName() { + return commonName; + } + + public void setCommonName(final String commonName) { + this.commonName = commonName; + } +}