Merge pull request #1985 from FOCONIS/bugfix/order_column_tree_depth

Update is missing for relations with @OrderColumn from a tree depth > 1
This commit is contained in:
Rob Bygrave
2020-04-12 16:19:01 +12:00
committed by GitHub
5 changed files with 117 additions and 7 deletions
@@ -85,11 +85,10 @@ public class TestOrderedList extends BaseTestCase {
Ebean.save(fresh);
sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(8);
assertSql(sql.get(0)).contains("update om_ordered_master set name=?, version=?");
assertSql(sql.get(1)).contains("update om_ordered_detail set version=?, sort_order=? where id=? and version=?");
assertThat(sql.get(3)).contains("update om_ordered_detail set name=?, version=?, sort_order=? where id=? and version=?");
assertThat(sql).hasSize(3);
assertSql(sql.get(0)).contains("update om_ordered_master set name=?, version=? where id=? and version=?; -- bind(m1-mod3");
assertSql(sql.get(1)).contains("update om_ordered_detail set name=?, version=?, sort_order=? where id=? and version=?");
assertThat(sql.get(2)).contains("bind(was 1,3,2,");
Ebean.delete(fresh);
@@ -1,8 +1,12 @@
package org.tests.order;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderColumn;
import java.util.List;
@Entity
@DiscriminatorValue("D")
@@ -13,6 +17,10 @@ public class OrderReferencedChild extends OrderReferencedParent {
@ManyToOne
OrderMaster master;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "child", orphanRemoval = true)
@OrderColumn(name = "sort_order")
List<OrderToy> toys;
public OrderReferencedChild(final String name) {
super(name);
}
@@ -32,4 +40,12 @@ public class OrderReferencedChild extends OrderReferencedParent {
public void setMaster(final OrderMaster master) {
this.master = master;
}
public List<OrderToy> getToys() {
return toys;
}
public void setToys(final List<OrderToy> toys) {
this.toys = toys;
}
}
@@ -0,0 +1,45 @@
package org.tests.order;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class OrderToy {
@Id
Integer id;
String title;
@ManyToOne
OrderReferencedChild child;
public OrderToy(final String title) {
this.title = title;
}
public Integer getId() {
return id;
}
public void setId(final Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(final String title) {
this.title = title;
}
public OrderReferencedChild getChild() {
return child;
}
public void setChild(final OrderReferencedChild child) {
this.child = child;
}
}
@@ -2,8 +2,11 @@ package org.tests.order;
import io.ebean.Ebean;
import io.ebean.TransactionalTestCase;
import org.ebeantest.LoggedSqlCollector;
import org.junit.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestOrderColumn extends TransactionalTestCase {
@@ -28,4 +31,50 @@ public class TestOrderColumn extends TransactionalTestCase {
assertThat(result.getChildren()).extracting(OrderReferencedChild::getChildName).containsExactly("c0", "c1", "c2", "c3", "c4");
}
@Test
public void testModifyTree() {
final OrderMaster master = new OrderMaster();
for (int i = 0; i < 5; i++) {
final OrderReferencedChild child = new OrderReferencedChild("p" + i);
child.setChildName("c" + i);
for (int j = 0; j < 3; j++) {
final OrderToy toy = new OrderToy("t" + i + j);
child.getToys().add(toy);
}
master.getChildren().add(child);
}
Ebean.save(master);
final OrderMaster result = Ebean.find(OrderMaster.class).findOne();
final List<OrderReferencedChild> children = result.getChildren();
assertThat(children).hasSize(5);
for (int i = 0; i < 5; i++) {
final List<OrderToy> toys = children.get(i).getToys();
for (int j = 0; j < 3; j++) {
final OrderToy toy = toys.get(j);
assertThat(toy.getTitle()).isEqualTo("t" + i + j);
}
}
// modify two toys
children.get(1).getToys().get(0).setTitle("tt10");
children.get(3).getToys().get(2).setTitle("tt32");
LoggedSqlCollector.start();
Ebean.save(result);
final List<String> sql = LoggedSqlCollector.current();
assertThat(sql).hasSize(3);
assertThat(sql.get(0)).contains("update order_toy set title=?, sort_order=? where id=?");
assertThat(sql.get(1)).contains("bind(tt10");
assertThat(sql.get(2)).contains("bind(tt32");
}
}