Enterprise Java Development@TOPIC@
By the time you hit this chapter, you should have had the opportunity to see many relationship combinations and now we will cover the last official one: many-to-many. The many-to-many relationship is not a common relationship because it relates entities without any properties associated with the relationships. Commonly a relationship that starts off being a many-to-many will turn into a many-to-one and one-to-many to allow for properties to be assigned to the relationship. In UML data modeling they would refer to the "one"/entity in the middle as an Associated Class
Create a JUnit test class to host tests for the many-to-many mappings.
package myorg.relex;
import static org.junit.Assert.*;
import javax.persistence.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.*;
public class Many2ManyBiTest extends JPATestBase {
private static Log log = LogFactory.getLog(Many2ManyBiTest.class);
@Test
public void testSample() {
log.info("testSample");
}
}
Verify the new JUnit test class builds and executes to completion
relationEx]$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyBiTest ... -HHH000401: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost:9092/h2db/ejava] ... [INFO] BUILD SUCCESS
package myorg.relex.many2many;
import javax.persistence.*;
/**
* This class provides an example of the inverse side of a many-to-many, uni-directional relationship
*/
@Entity
@Table(name="RELATIONEX_INDIVIDUAL")
public class Individual {
@Id @GeneratedValue
private int id;
@Column(length=32, nullable=false)
private String name;
protected Individual() {}
public Individual(String name) {
this.name = name;
}
public int getId() { return id; }
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return name==null? 0 : name.hashCode();
}
@Override
public boolean equals(Object obj) {
try {
if (this == obj) return true;
Individual rhs = (Individual) obj;
if (name==null && rhs.name != null) { return false; }
return name.equals(rhs.name);
} catch (Exception ex) { return false; }
}
}
package myorg.relex.many2many;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
/**
* This class provides an example of the owning side of a many-to-many, uni-directional relationship.
*/
@Entity
@Table(name="RELATIONEX_GROUP")
public class Group {
@Id @GeneratedValue
private int id;
@ManyToMany
// @JoinTable(name="RELATIONEX_GROUP_MEMBER",
// joinColumns=@JoinColumn(name="GROUP_ID"),
// inverseJoinColumns=@JoinColumn(name="MEMBER_ID"))
Set<Individual> members;
@Column(length=32, nullable=false)
private String name;
protected Group() {}
public Group(String name) {
this.name = name;
}
public int getId() { return id; }
public Set<Individual> getMembers() {
if (members == null) {
members = new HashSet<Individual>();
}
return members;
}
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
}
Add the new entitiy classes to your persistence unit.
<class>myorg.relex.many2many.Group</class>
<class>myorg.relex.many2many.Individual</class>
$ mvn clean process-test-classes; more target/classes/ddl/relationEx-createJPA.ddl ... create table RELATIONEX_GROUP ( id integer generated by default as identity, name varchar(32) not null, primary key (id) ); create table RELATIONEX_GROUP_RELATIONEX_INDIVIDUAL ( RELATIONEX_GROUP_id integer not null, members_id integer not null, primary key (RELATIONEX_GROUP_id, members_id) ); ... create table RELATIONEX_INDIVIDUAL ( id integer generated by default as identity, name varchar(32) not null, primary key (id) ); ... alter table RELATIONEX_GROUP_RELATIONEX_INDIVIDUAL add constraint FK4DBB1EB9B0D6112E foreign key (members_id) references RELATIONEX_INDIVIDUAL; alter table RELATIONEX_GROUP_RELATIONEX_INDIVIDUAL add constraint FK4DBB1EB9CE0046D6 foreign key (RELATIONEX_GROUP_id) references RELATIONEX_GROUP;
public class Group {
...
@ManyToMany
@JoinTable(name="RELATIONEX_GROUP_MEMBER",
joinColumns=@JoinColumn(name="GROUP_ID"),
inverseJoinColumns=@JoinColumn(name="MEMBER_ID"))
Set<Individual> members;
$ mvn clean process-test-classes; more target/classes/ddl/relationEx-createJPA.ddl ... create table RELATIONEX_GROUP ( id integer generated by default as identity, name varchar(32) not null, primary key (id) ); create table RELATIONEX_GROUP_MEMBER ( GROUP_ID integer not null, MEMBER_ID integer not null, primary key (GROUP_ID, MEMBER_ID) ); ... create table RELATIONEX_INDIVIDUAL ( id integer generated by default as identity, name varchar(32) not null, primary key (id) ); ... alter table RELATIONEX_GROUP_MEMBER add constraint FK2ADA1F0A50B9540D foreign key (MEMBER_ID) references RELATIONEX_INDIVIDUAL; alter table RELATIONEX_GROUP_MEMBER add constraint FK2ADA1F0AD00E5846 foreign key (GROUP_ID) references RELATIONEX_GROUP;
@Test
public void testManyToManyUni() {
log.info("*** testManyToManyUni ***");
log.debug("persisting owner");
Group group = new Group("board");
em.persist(group);
em.flush();
log.debug("persisting inverse");
Individual individual = new Individual("manny");
em.persist(individual);
em.flush();
log.debug("relating parent to inverse");
group.getMembers().add(individual);
em.flush();
}
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... -*** testManyToManyUni *** -persisting owner Hibernate: insert into RELATIONEX_GROUP (id, name) values (null, ?) -persisting inverse Hibernate: insert into RELATIONEX_INDIVIDUAL (id, name) values (null, ?) -relating parent to inverse Hibernate: insert into RELATIONEX_GROUP_MEMBER (GROUP_ID, MEMBER_ID) values (?, ?) ... [INFO] BUILD SUCCESS
log.debug("getting new instances");
em.clear();
Group group2 = em.find(Group.class, group.getId());
log.debug("checking owner");
assertEquals("unexpected group.name", group.getName(), group2.getName());
log.debug("checking inverse");
assertEquals("unexpected size", 1, group2.getMembers().size());
assertEquals("unexpected member.name", individual.getName(), group2.getMembers().iterator().next().getName());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... -getting new instances Hibernate: select group0_.id as id43_0_, group0_.name as name43_0_ from RELATIONEX_GROUP group0_ where group0_.id=? -checking owner -checking inverse Hibernate: select members0_.GROUP_ID as GROUP1_43_1_, members0_.MEMBER_ID as MEMBER2_1_, individual1_.id as id44_0_, individual1_.name as name44_0_ from RELATIONEX_GROUP_MEMBER members0_ inner join RELATIONEX_INDIVIDUAL individual1_ on members0_.MEMBER_ID=individual1_.id where members0_.GROUP_ID=? ... [INFO] BUILD SUCCESS
log.debug("adding inverse members");
Individual individualB = new Individual("moe");
Individual individualC = new Individual("jack");
group2.getMembers().add(individualB);
group2.getMembers().add(individualC);
em.persist(individualB);
em.persist(individualC);
em.flush();
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... -adding inverse members Hibernate: insert into RELATIONEX_INDIVIDUAL (id, name) values (null, ?) Hibernate: insert into RELATIONEX_INDIVIDUAL (id, name) values (null, ?) Hibernate: insert into RELATIONEX_GROUP_MEMBER (GROUP_ID, MEMBER_ID) values (?, ?) Hibernate: insert into RELATIONEX_GROUP_MEMBER (GROUP_ID, MEMBER_ID) values (?, ?) ... [INFO] BUILD SUCCESS
log.debug("adding owning members");
Group groupB = new Group("night shift");
groupB.getMembers().add(individualB);
groupB.getMembers().add(individualC);
em.persist(groupB);
em.flush();
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... -adding owning members Hibernate: insert into RELATIONEX_GROUP (id, name) values (null, ?) Hibernate: insert into RELATIONEX_GROUP_MEMBER (GROUP_ID, MEMBER_ID) values (?, ?) Hibernate: insert into RELATIONEX_GROUP_MEMBER (GROUP_ID, MEMBER_ID) values (?, ?) ... [INFO] BUILD SUCCESS
log.debug("checking relations");
assertEquals("unexpected relations for member 1", 1, em.createQuery(
"select count(g) from Group g where :individual member of g.members", Number.class)
.setParameter("individual", individual)
.getSingleResult().intValue());
assertEquals("unexpected relations for member 2", 2, em.createQuery(
"select count(g) from Group g where :individual member of g.members", Number.class)
.setParameter("individual", individualB)
.getSingleResult().intValue());
assertEquals("unexpected relations for member 3", 2, em.createQuery(
"select count(g) from Group g where :individual member of g.members", Number.class)
.setParameter("individual", individualC)
.getSingleResult().intValue());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... Hibernate: select count(group0_.id) as col_0_0_ from RELATIONEX_GROUP group0_ where ? in ( select individual2_.id from RELATIONEX_GROUP_MEMBER members1_, RELATIONEX_INDIVIDUAL individual2_ where group0_.id=members1_.GROUP_ID and members1_.MEMBER_ID=individual2_.id ) limit ? (x3) ... [INFO] BUILD SUCCESS
log.debug("removing relations");
assertTrue(group2.getMembers().remove(individualB));
assertTrue(groupB.getMembers().remove(individualB));
log.debug("verifying relation removal");
assertEquals("unexpected relations for member 1", 0, em.createQuery(
"select count(g) from Group g, IN (g.members) m where m = :individual", Number.class)
.setParameter("individual", individualB)
.getSingleResult().intValue());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... -removing relations -verifying relation removal Hibernate: delete from RELATIONEX_GROUP_MEMBER where GROUP_ID=? and MEMBER_ID=? Hibernate: delete from RELATIONEX_GROUP_MEMBER where GROUP_ID=? and MEMBER_ID=? Hibernate: select count(group0_.id) as col_0_0_ from RELATIONEX_GROUP group0_ inner join RELATIONEX_GROUP_MEMBER members1_ on group0_.id=members1_.GROUP_ID inner join RELATIONEX_INDIVIDUAL individual2_ on members1_.MEMBER_ID=individual2_.id where individual2_.id=? limit ? ... [INFO] BUILD SUCCESS
log.debug("verifying inverse was not removed");
em.flush(); em.clear();
assertNotNull(em.find(Individual.class, individualB.getId()));
log.debug("removing initial owner");
em.remove(em.find(Group.class, group.getId()));
em.flush();
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyUni ... -verifying inverse was not removed Hibernate: select individual0_.id as id44_0_, individual0_.name as name44_0_ from RELATIONEX_INDIVIDUAL individual0_ where individual0_.id=?
-removing initial owner Hibernate: select group0_.id as id43_0_, group0_.name as name43_0_ from RELATIONEX_GROUP group0_ where group0_.id=? Hibernate: delete from RELATIONEX_GROUP_MEMBER where GROUP_ID=? Hibernate: delete from RELATIONEX_GROUP where id=? ... [INFO] BUILD SUCCESS
package myorg.relex.many2many;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import javax.persistence.*;
/**
* This class provides an example of a many-to-many, bi-directional relationship that just
* happens to be recursive. Both ends of the relationship reference an instance of this class.
*/
@Entity
@Table(name="RELATIONEX_NODE")
public class Node {
@Id
@Column(length=36, nullable=false)
private String id;
@ManyToMany(cascade={CascadeType.PERSIST}, fetch=FetchType.LAZY)
@JoinTable(name="RELATIONEX_NODE_REL",
joinColumns=@JoinColumn(name="PARENT_ID"),
inverseJoinColumns=@JoinColumn(name="CHILD_ID"))
private Set<Node> children;
@ManyToMany(mappedBy="children", fetch=FetchType.EAGER)
private Set<Node> parents;
@Column(length=32, nullable=false)
private String name;
public Node() { id=UUID.randomUUID().toString(); }
public Node(String name) {
this();
this.name = name;
}
public Node(Node parent, String name) {
this();
this.name = name;
parent.getChildren().add(this);
getParents().add(parent);
}
public String getId() { return id; }
public String getName() { return name; }
public void setName(String name) {
this.name = name;
}
public Set<Node> getChildren() {
if (children==null) {
children = new HashSet<Node>();
}
return children;
}
public Set<Node> getParents() {
if (parents == null) {
parents = new HashSet<Node>();
}
return parents;
}
@Override
public int hashCode() {
return id==null?0:id.hashCode();
}
@Override
public boolean equals(Object obj) {
try {
if (this == obj) { return true; }
Node rhs = (Node)obj;
if (id==null && rhs.id != null) { return false; }
return id.equals(rhs.id);
} catch (Exception ex) { return false; }
}
}
Add the new entity to the persistence unit.
<class>myorg.relex.many2many.Node</class>
$ mvn clean process-test-classes; more target/classes/ddl/relationEx-createJPA.ddl ... create table RELATIONEX_NODE ( id varchar(36) not null, name varchar(32) not null, primary key (id) ); create table RELATIONEX_NODE_REL ( PARENT_ID varchar(36) not null, CHILD_ID varchar(36) not null, primary key (PARENT_ID, CHILD_ID) ); ... alter table RELATIONEX_NODE_REL add constraint FK7D1BC34C3F5FCCB4 foreign key (CHILD_ID) references RELATIONEX_NODE; alter table RELATIONEX_NODE_REL add constraint FK7D1BC34C57DC6666 foreign key (PARENT_ID) references RELATIONEX_NODE;
@Test
public void testManyToManyBi() {
log.info("*** testManyToManyBi ***");
log.debug("create instances");
Node one = new Node("one");
Node two = new Node(one,"two");
em.persist(one);
em.flush();
}
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -*** testManyToManyBi *** -create instances Hibernate: insert into RELATIONEX_NODE (name, id) values (?, ?) Hibernate: insert into RELATIONEX_NODE (name, id) values (?, ?) Hibernate: insert into RELATIONEX_NODE_REL (PARENT_ID, CHILD_ID) values (?, ?) ... [INFO] BUILD SUCCESS
log.debug("getting new instances from owning side");
em.clear();
Node one2 = em.find(Node.class, one.getId());
assertNotNull("owning side not found", one2);
log.debug("checking owning side");
assertEquals("unexpected owning.name", one.getName(), one2.getName());
log.debug("checking parents");
assertEquals("unexpected parents.size", 0, one2.getParents().size());
log.debug("checking children");
assertEquals("unexpected children.size", 1, one2.getChildren().size());
assertEquals("unexpected child.name", two.getName(), one2.getChildren().iterator().next().getName());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -getting new instances from owning side Hibernate: select node0_.id as id45_1_, node0_.name as name45_1_, parents1_.CHILD_ID as CHILD2_45_3_, node2_.id as PARENT1_3_, node2_.id as id45_0_, node2_.name as name45_0_ from RELATIONEX_NODE node0_ left outer join RELATIONEX_NODE_REL parents1_ on node0_.id=parents1_.CHILD_ID left outer join RELATIONEX_NODE node2_ on parents1_.PARENT_ID=node2_.id where node0_.id=? -checking owning side -checking parents
-checking children Hibernate: select children0_.PARENT_ID as PARENT1_45_1_, children0_.CHILD_ID as CHILD2_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL children0_ inner join RELATIONEX_NODE node1_ on children0_.CHILD_ID=node1_.id where children0_.PARENT_ID=? Hibernate: select parents0_.CHILD_ID as CHILD2_45_1_, parents0_.PARENT_ID as PARENT1_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL parents0_ inner join RELATIONEX_NODE node1_ on parents0_.PARENT_ID=node1_.id where parents0_.CHILD_ID=? ... [INFO] BUILD SUCCESS
log.debug("adding more inverse instances");
Node twoB = new Node(one2, "twoB");
Node twoC = new Node(one2, "twoC");
em.persist(one2);
em.flush();
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -adding more inverse instances Hibernate: insert into RELATIONEX_NODE (name, id) values (?, ?) Hibernate: insert into RELATIONEX_NODE (name, id) values (?, ?) Hibernate: insert into RELATIONEX_NODE_REL (PARENT_ID, CHILD_ID) values (?, ?) Hibernate: insert into RELATIONEX_NODE_REL (PARENT_ID, CHILD_ID) values (?, ?) ... [INFO] BUILD SUCCESS
log.debug("getting new instances from inverse side"); em.clear(); Node two2 = em.find(Node.class, two.getId()); assertNotNull("inverse node not found", two2); log.debug("checking inverse side"); assertEquals("unexpected name", two.getName(), two2.getName()); log.debug("checking parents"); assertEquals("unexpected parents.size", 1, two2.getParents().size()); log.debug("checking children"); assertEquals("unexpected children.size", 0, two2.getChildren().size());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -getting new instances from inverse side Hibernate: select node0_.id as id45_1_, node0_.name as name45_1_, parents1_.CHILD_ID as CHILD2_45_3_, node2_.id as PARENT1_3_, node2_.id as id45_0_, node2_.name as name45_0_ from RELATIONEX_NODE node0_ left outer join RELATIONEX_NODE_REL parents1_ on node0_.id=parents1_.CHILD_ID left outer join RELATIONEX_NODE node2_ on parents1_.PARENT_ID=node2_.id where node0_.id=? Hibernate: select parents0_.CHILD_ID as CHILD2_45_1_, parents0_.PARENT_ID as PARENT1_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL parents0_ inner join RELATIONEX_NODE node1_ on parents0_.PARENT_ID=node1_.id where parents0_.CHILD_ID=? -checking inverse side -checking parents -checking children Hibernate: select children0_.PARENT_ID as PARENT1_45_1_, children0_.CHILD_ID as CHILD2_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL children0_ inner join RELATIONEX_NODE node1_ on children0_.CHILD_ID=node1_.id where children0_.PARENT_ID=? ... [INFO] BUILD SUCCESS
log.debug("adding owning entity");
Node oneB = new Node("oneB");
oneB.getChildren().add(two2);
two2.getParents().add(oneB);
em.persist(oneB);
em.flush();
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -adding owning entity Hibernate: insert into RELATIONEX_NODE (name, id) values (?, ?) Hibernate: insert into RELATIONEX_NODE_REL (PARENT_ID, CHILD_ID) values (?, ?) ... [INFO] BUILD SUCCESS
Add the following lines to the test method to verify the number of relationships that exist.
log.debug("checking relationships");
assertEquals("unexpected parents", 0,
em.createQuery("select count(p) from Node n, IN (n.parents) p where n=:node", Number.class)
.setParameter("node", one)
.getSingleResult().intValue());
assertEquals("unexpected parents", 2,
em.createQuery("select count(p) from Node n, IN (n.parents) p where n=:node", Number.class)
.setParameter("node", two)
.getSingleResult().intValue());
assertEquals("unexpected parents", 1,
em.createQuery("select count(p) from Node n, IN (n.parents) p where n=:node", Number.class)
.setParameter("node", twoB)
.getSingleResult().intValue());
assertEquals("unexpected parents", 1,
em.createQuery("select count(p) from Node n, IN (n.parents) p where n=:node", Number.class)
.setParameter("node", twoC)
.getSingleResult().intValue());
assertEquals("unexpected children", 3,
em.createQuery("select count(c) from Node n, IN (n.children) c where n=:node", Number.class)
.setParameter("node", one)
.getSingleResult().intValue());
assertEquals("unexpected children", 0,
em.createQuery("select count(c) from Node n, IN (n.children) c where n=:node", Number.class)
.setParameter("node", two)
.getSingleResult().intValue());
assertEquals("unexpected children", 1,
em.createQuery("select count(c) from Node n, IN (n.children) c where n=:node", Number.class)
.setParameter("node", oneB)
.getSingleResult().intValue());
Rebuild the module and re-run the unit test. This shows the assertions on the queuries passing.
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -checking relationships Hibernate: select count(node2_.id) as col_0_0_ from RELATIONEX_NODE node0_ inner join RELATIONEX_NODE_REL parents1_ on node0_.id=parents1_.CHILD_ID inner join RELATIONEX_NODE node2_ on parents1_.PARENT_ID=node2_.id where node0_.id=? limit ? (x3 more) Hibernate: select count(node2_.id) as col_0_0_ from RELATIONEX_NODE node0_ inner join RELATIONEX_NODE_REL children1_ on node0_.id=children1_.PARENT_ID inner join RELATIONEX_NODE node2_ on children1_.CHILD_ID=node2_.id where node0_.id=? limit ? (x2 more) ... [INFO] BUILD SUCCESS
log.debug("getting managed owning side");
assertNotNull(one = em.find(Node.class, one.getId()));
log.debug("removing relationship");
one.getChildren().remove(two);
two.getParents().remove(one);
em.flush();
assertEquals("unexpected children", 2,
em.createQuery("select count(c) from Node n, IN (n.children) c where n=:node", Number.class)
.setParameter("node", one)
.getSingleResult().intValue());
assertEquals("unexpected parents", 1,
em.createQuery("select count(p) from Node n, IN (n.parents) p where n=:node", Number.class)
.setParameter("node", two)
.getSingleResult().intValue());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -removing relationship Hibernate: select children0_.PARENT_ID as PARENT1_45_1_, children0_.CHILD_ID as CHILD2_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL children0_ inner join RELATIONEX_NODE node1_ on children0_.CHILD_ID=node1_.id where children0_.PARENT_ID=? Hibernate: select parents0_.CHILD_ID as CHILD2_45_1_, parents0_.PARENT_ID as PARENT1_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL parents0_ inner join RELATIONEX_NODE node1_ on parents0_.PARENT_ID=node1_.id where parents0_.CHILD_ID=? Hibernate: select parents0_.CHILD_ID as CHILD2_45_1_, parents0_.PARENT_ID as PARENT1_1_, node1_.id as id45_0_, node1_.name as name45_0_ from RELATIONEX_NODE_REL parents0_ inner join RELATIONEX_NODE node1_ on parents0_.PARENT_ID=node1_.id where parents0_.CHILD_ID=? Hibernate: delete from RELATIONEX_NODE_REL where PARENT_ID=? and CHILD_ID=? Hibernate: select count(node2_.id) as col_0_0_ ... [INFO] BUILD SUCCESS
Add the following lines to the test method to remove one of the owning entities.
log.debug("deleting owner");
em.remove(oneB);
em.flush();
assertEquals("unexpected parents", 0,
em.createQuery("select count(p) from Node n, IN (n.parents) p where n=:node", Number.class)
.setParameter("node", two)
.getSingleResult().intValue());
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -deleting owner Hibernate: delete from RELATIONEX_NODE_REL where PARENT_ID=? Hibernate: delete from RELATIONEX_NODE where id=? Hibernate: select count(node2_.id) as col_0_0_ from RELATIONEX_NODE node0_ inner join RELATIONEX_NODE_REL parents1_ on node0_.id=parents1_.CHILD_ID inner join RELATIONEX_NODE node2_ on parents1_.PARENT_ID=node2_.id where node0_.id=? limit ? ... [INFO] BUILD SUCCESS
log.debug("deleting inverse");
assertNotNull(twoB = em.find(Node.class, twoB.getId()));
em.remove(twoB);
em.flush();
assertNull("inverse not deleted", em.find(Node.class, twoB.getId()));
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -deleting inverse ... Failed tests: testManyToManyBi(myorg.relex.Many2ManyTest): inverse not deleted ... [INFO] BUILD FAILURE
log.debug("deleting inverse"); assertNotNull(twoB = em.find(Node.class, twoB.getId())); em.remove(twoB); em.flush(); // assertNull("inverse not deleted", em.find(Node.class, twoB.getId())); one.getChildren().remove(twoB); em.flush(); assertNull("inverse not deleted", em.find(Node.class, twoB.getId()));
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -deleting inverse Hibernate: delete from RELATIONEX_NODE_REL where PARENT_ID=? and CHILD_ID=? ... Failed tests: testManyToManyBi(myorg.relex.Many2ManyTest): inverse not deleted ... [INFO] BUILD FAILURE
log.debug("deleting inverse"); assertNotNull(twoB = em.find(Node.class, twoB.getId())); em.remove(twoB); em.flush(); // assertNull("inverse not deleted", em.find(Node.class, twoB.getId())); one.getChildren().remove(twoB); em.flush(); // assertNull("inverse not deleted", em.find(Node.class, twoB.getId())); em.remove(twoB); em.flush(); assertNull("inverse not deleted", em.find(Node.class, twoB.getId()));
$ mvn clean test -P\!h2db -Ph2srv -Dtest=myorg.relex.Many2ManyTest#testManyToManyBi ... -deleting inverse Hibernate: delete from RELATIONEX_NODE_REL where PARENT_ID=? and CHILD_ID=? Hibernate: delete from RELATIONEX_NODE_REL where PARENT_ID=? Hibernate: delete from RELATIONEX_NODE where id=? Hibernate: select node0_.id as id45_1_, node0_.name as name45_1_, parents1_.CHILD_ID as CHILD2_45_3_, node2_.id as PARENT1_3_, node2_.id as id45_0_, node2_.name as name45_0_ from RELATIONEX_NODE node0_ left outer join RELATIONEX_NODE_REL parents1_ on node0_.id=parents1_.CHILD_ID left outer join RELATIONEX_NODE node2_ on parents1_.PARENT_ID=node2_.id where node0_.id=? ... [INFO] BUILD SUCCESS