HHH-16031 Test @ManyToMany + @JoinTable(inverseColumn) on a SortedSet
This commit is contained in:
parent
0983b47252
commit
241fe54d0a
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* 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.orm.test.annotations.manytomany;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import org.hibernate.annotations.SortNatural;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.JoinColumn;
|
||||
import jakarta.persistence.JoinTable;
|
||||
import jakarta.persistence.ManyToMany;
|
||||
|
||||
@TestForIssue(jiraKey = "HHH-16031")
|
||||
public class ManyToManyInverseJoinColumnSortedSetTest extends BaseCoreFunctionalTestCase {
|
||||
@Test
|
||||
public void testDefault() {
|
||||
inTransaction( session -> {
|
||||
ContainingEntity containing = new ContainingEntity();
|
||||
containing.setId( 0 );
|
||||
|
||||
ContainedEntity contained1 = new ContainedEntity();
|
||||
contained1.setId( 1 );
|
||||
containing.getContained().add( contained1 );
|
||||
contained1.getContaining().add( containing );
|
||||
|
||||
ContainedEntity contained2 = new ContainedEntity();
|
||||
contained2.setId( 2 );
|
||||
containing.getContained().add( contained2 );
|
||||
contained2.getContaining().add( containing );
|
||||
|
||||
session.persist( contained1 );
|
||||
session.persist( contained2 );
|
||||
session.persist( containing );
|
||||
} );
|
||||
|
||||
inTransaction( session -> {
|
||||
ContainingEntity containing = session.get( ContainingEntity.class, 0 );
|
||||
assertThat( containing.getContained() )
|
||||
.extracting( ContainedEntity::getId )
|
||||
.containsExactly( 1, 2 );
|
||||
} );
|
||||
|
||||
inTransaction( session -> {
|
||||
ContainingEntity containing = session.get( ContainingEntity.class, 0 );
|
||||
ContainedEntity contained1 = session.get( ContainedEntity.class, 1 );
|
||||
contained1.getContaining().remove( containing );
|
||||
containing.getContained().remove( contained1 );
|
||||
assertThat( containing.getContained() )
|
||||
.extracting( ContainedEntity::getId )
|
||||
.containsExactly( 2 );
|
||||
} );
|
||||
|
||||
// Try again from a new transaction;
|
||||
// with the bug unsolved, getContained() returns an empty collection!
|
||||
inTransaction( session -> {
|
||||
ContainingEntity containing = session.get( ContainingEntity.class, 0 );
|
||||
assertThat( containing.getContained() )
|
||||
.extracting( ContainedEntity::getId )
|
||||
.containsExactly( 2 );
|
||||
} );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class[] getAnnotatedClasses() {
|
||||
return new Class[]{
|
||||
ContainingEntity.class,
|
||||
ContainedEntity.class
|
||||
};
|
||||
}
|
||||
|
||||
@Entity(name = "containing")
|
||||
public static class ContainingEntity {
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@ManyToMany
|
||||
@JoinTable(inverseJoinColumns = @JoinColumn(name = "inverse"))
|
||||
@SortNatural
|
||||
private SortedSet<ContainedEntity> contained = new TreeSet<>();
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public SortedSet<ContainedEntity> getContained() {
|
||||
return contained;
|
||||
}
|
||||
|
||||
public void setContained(SortedSet<ContainedEntity> contained) {
|
||||
this.contained = contained;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Entity(name = "contained")
|
||||
public static class ContainedEntity implements Comparable<ContainedEntity> {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
@ManyToMany(mappedBy = "contained")
|
||||
private List<ContainingEntity> containing = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public int compareTo(ContainedEntity o) {
|
||||
return getId() - o.getId();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public List<ContainingEntity> getContaining() {
|
||||
return containing;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue