HHH-16297 Add test for issue
This commit is contained in:
parent
19619cbcf0
commit
b56be6cdab
|
@ -0,0 +1,124 @@
|
|||
package org.hibernate.orm.test.collection;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.ElementCollection;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
import org.assertj.core.api.Assertions;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DomainModel(annotatedClasses = ElementCollectionUpdateTest.Person.class)
|
||||
@SessionFactory
|
||||
@TestForIssue(jiraKey = "HHH-16297")
|
||||
public class ElementCollectionUpdateTest {
|
||||
|
||||
private Person thePerson;
|
||||
|
||||
@BeforeAll
|
||||
public void prepare(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Set<String> phones = new HashSet<>( Arrays.asList( "999-999-9999", "111-111-1111", "123-456-7890" ) );
|
||||
thePerson = new Person( 7242000, "Claude", phones );
|
||||
session.persist( thePerson );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeElementAndAddNewOne(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Person foundPerson = session.find( Person.class, thePerson.getId() );
|
||||
Assertions.assertThat( foundPerson ).isNotNull();
|
||||
Set<String> phones = foundPerson.getPhones();
|
||||
phones.remove( "111-111-1111" );
|
||||
phones.add( "000" );
|
||||
assertThat( phones )
|
||||
.containsExactlyInAnyOrder( "999-999-9999", "123-456-7890", "000" );
|
||||
} );
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
assertThat( person.getPhones() )
|
||||
.containsExactlyInAnyOrder( "999-999-9999", "123-456-7890", "000" );
|
||||
} );
|
||||
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
person.getPhones().remove( "123-456-7890" );
|
||||
} );
|
||||
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
Set<String> phones = person.getPhones();
|
||||
assertThat( phones )
|
||||
.containsExactlyInAnyOrder( "999-999-9999", "000" );
|
||||
phones.add( "111-111-1111" );
|
||||
|
||||
} );
|
||||
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
Set<String> phones = person.getPhones();
|
||||
assertThat( phones )
|
||||
.containsExactlyInAnyOrder( "999-999-9999", "000", "111-111-1111" );
|
||||
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity(name = "Person")
|
||||
@Table(name = "Person")
|
||||
static class Person {
|
||||
@Id
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
@ElementCollection(fetch = FetchType.EAGER)
|
||||
private Set<String> phones;
|
||||
|
||||
public Person() {
|
||||
}
|
||||
|
||||
public Person(Integer id, String name, Collection<String> phones) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.phones = new HashSet<>( phones );
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setPhones(Set<String> phones) {
|
||||
this.phones = phones;
|
||||
}
|
||||
|
||||
public Set<String> getPhones() {
|
||||
return phones;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,175 @@
|
|||
package org.hibernate.orm.test.collection;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import jakarta.persistence.Table;
|
||||
import org.assertj.core.api.Assertions;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DomainModel(
|
||||
annotatedClasses = {
|
||||
OneToManyUpdateTest.Person.class,
|
||||
OneToManyUpdateTest.Address.class
|
||||
}
|
||||
)
|
||||
@SessionFactory
|
||||
@TestForIssue(jiraKey = "HHH-16297")
|
||||
public class OneToManyUpdateTest {
|
||||
|
||||
private static final Integer PERSON_ID = 7242000;
|
||||
|
||||
@BeforeAll
|
||||
public void prepare(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Address address1 = new Address( 1, "via milano", "Roma" );
|
||||
Address address2 = new Address( 2, "via Cartesio", "Milano" );
|
||||
Set<Address> addresses = new HashSet<>( Arrays.asList(
|
||||
address1,
|
||||
address2
|
||||
) );
|
||||
Person person = new Person( PERSON_ID, "Claude", addresses );
|
||||
session.persist( address1 );
|
||||
session.persist( address2 );
|
||||
session.persist( person );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeElementAndAddNewOne(SessionFactoryScope scope) {
|
||||
Address address3 = new Address( 3, "via Pierce", "Milano" );
|
||||
Address address2 = new Address( 2, "via Cartesio", "Milano" );
|
||||
scope.inTransaction( session -> {
|
||||
Person foundPerson = session.find( Person.class, PERSON_ID );
|
||||
Assertions.assertThat( foundPerson ).isNotNull();
|
||||
Set<Address> addresses = foundPerson.getAddresses();
|
||||
Address address1 = new Address( 1, "via milano", "Roma" );
|
||||
addresses.remove( address1 );
|
||||
addresses.add( address3 );
|
||||
session.persist( address3 );
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
address3,
|
||||
address2
|
||||
);
|
||||
} );
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, PERSON_ID );
|
||||
Set<Address> addresses = person.getAddresses();
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
address3,
|
||||
address2
|
||||
);
|
||||
addresses.remove( address2 );
|
||||
|
||||
} );
|
||||
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, PERSON_ID );
|
||||
Set<Address> addresses = person.getAddresses();
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
address3
|
||||
);
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity(name = "Person")
|
||||
@Table(name = "Person")
|
||||
static class Person {
|
||||
@Id
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
@OneToMany(fetch = FetchType.EAGER)
|
||||
private Set<Address> addresses;
|
||||
|
||||
public Person() {
|
||||
}
|
||||
|
||||
public Person(Integer id, String name, Collection<Address> addresses) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.addresses = new HashSet<>( addresses );
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Set<Address> getAddresses() {
|
||||
return addresses;
|
||||
}
|
||||
|
||||
public void setAddresses(Set<Address> addresses) {
|
||||
this.addresses = addresses;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Entity(name = "Address")
|
||||
@Table(name = "ADDRESS_TABLE")
|
||||
public static class Address {
|
||||
|
||||
@Id
|
||||
private Integer id;
|
||||
|
||||
private String street;
|
||||
|
||||
private String city;
|
||||
|
||||
public Address() {
|
||||
}
|
||||
|
||||
public Address(Integer id, String street, String city) {
|
||||
this.id = id;
|
||||
this.street = street;
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
Address address = (Address) o;
|
||||
return Objects.equals( street, address.street ) && Objects.equals( city, address.city );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash( street, city );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
package org.hibernate.orm.test.embeddable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Basic;
|
||||
import jakarta.persistence.ElementCollection;
|
||||
import jakarta.persistence.Embeddable;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
import org.assertj.core.api.Assertions;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DomainModel(annotatedClasses = EmbeddableAsElementCollectionUpdateTest.Person.class)
|
||||
@SessionFactory
|
||||
@TestForIssue(jiraKey = "HHH-16297")
|
||||
public class EmbeddableAsElementCollectionUpdateTest {
|
||||
|
||||
private Person thePerson;
|
||||
|
||||
@BeforeAll
|
||||
public void prepare(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Set<Address> addresses = new HashSet<>( Arrays.asList(
|
||||
new Address( "via milano", "Roma" ),
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
) );
|
||||
thePerson = new Person( 7242000, "Claude", addresses );
|
||||
session.persist( thePerson );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeElementAndAddNewOne(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Person foundPerson = session.find( Person.class, thePerson.getId() );
|
||||
Assertions.assertThat( foundPerson ).isNotNull();
|
||||
Set<Address> addresses = foundPerson.getAddresses();
|
||||
addresses.remove( new Address( "via milano", "Roma" ) );
|
||||
addresses.add( new Address( "via Pierce", null ) );
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
new Address( "via Pierce", null ),
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
);
|
||||
} );
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
Set<Address> addresses = person.getAddresses();
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
new Address( "via Pierce", null ),
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
);
|
||||
addresses.remove( new Address( "via Pierce", null ) );
|
||||
} );
|
||||
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
Set<Address> addresses = person.getAddresses();
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
);
|
||||
addresses.remove( new Address( "via Pierce", null ) );
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity(name = "Person")
|
||||
@Table(name = "Person")
|
||||
static class Person {
|
||||
@Id
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
@ElementCollection(fetch = FetchType.EAGER)
|
||||
private Set<Address> addresses;
|
||||
|
||||
public Person() {
|
||||
}
|
||||
|
||||
public Person(Integer id, String name, Collection<Address> addresses) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.addresses = new HashSet<>( addresses );
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Set<Address> getAddresses() {
|
||||
return addresses;
|
||||
}
|
||||
|
||||
public void setAddresses(Set<Address> addresses) {
|
||||
this.addresses = addresses;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
public static class Address {
|
||||
@Basic(optional = false)
|
||||
private String street;
|
||||
private String city;
|
||||
|
||||
public Address() {
|
||||
}
|
||||
|
||||
public Address(String street, String city) {
|
||||
this.street = street;
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
Address address = (Address) o;
|
||||
return Objects.equals( street, address.street ) && Objects.equals( city, address.city );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash( street, city );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,147 @@
|
|||
package org.hibernate.orm.test.embeddable;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.orm.junit.DomainModel;
|
||||
import org.hibernate.testing.orm.junit.SessionFactory;
|
||||
import org.hibernate.testing.orm.junit.SessionFactoryScope;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import jakarta.persistence.Basic;
|
||||
import jakarta.persistence.ElementCollection;
|
||||
import jakarta.persistence.Embeddable;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.FetchType;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.Table;
|
||||
import org.assertj.core.api.Assertions;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@DomainModel(annotatedClasses = EmbeddableWithNotOprionalAttributeAsElementCollectionUpdateTest.Person.class)
|
||||
@SessionFactory
|
||||
@TestForIssue(jiraKey = "HHH-16297")
|
||||
public class EmbeddableWithNotOprionalAttributeAsElementCollectionUpdateTest {
|
||||
|
||||
private Person thePerson;
|
||||
|
||||
@BeforeAll
|
||||
public void prepare(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Set<Address> addresses = new HashSet<>( Arrays.asList(
|
||||
new Address( "via milano", "Roma" ),
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
) );
|
||||
thePerson = new Person( 7242000, "Claude", addresses );
|
||||
session.persist( thePerson );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeElementAndAddNewOne(SessionFactoryScope scope) {
|
||||
scope.inTransaction( session -> {
|
||||
Person foundPerson = session.find( Person.class, thePerson.getId() );
|
||||
Assertions.assertThat( foundPerson ).isNotNull();
|
||||
Set<Address> addresses = foundPerson.getAddresses();
|
||||
addresses.remove( new Address( "via milano", "Roma" ) );
|
||||
addresses.add( new Address( "via Pierce", "Milano" ) );
|
||||
assertThat( addresses )
|
||||
.containsExactlyInAnyOrder(
|
||||
new Address( "via Pierce", "Milano" ),
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
);
|
||||
} );
|
||||
scope.inTransaction( session -> {
|
||||
Person person = session.find( Person.class, thePerson.getId() );
|
||||
assertThat( person.getAddresses() )
|
||||
.containsExactlyInAnyOrder(
|
||||
new Address( "via Pierce", "Milano" ),
|
||||
new Address( "via Cartesio", "Milano" )
|
||||
);
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity(name = "Person")
|
||||
@Table(name = "Person")
|
||||
static class Person {
|
||||
@Id
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
@ElementCollection(fetch = FetchType.EAGER)
|
||||
private Set<Address> addresses;
|
||||
|
||||
public Person() {
|
||||
}
|
||||
|
||||
public Person(Integer id, String name, Collection<Address> addresses) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.addresses = new HashSet<>( addresses );
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Set<Address> getAddresses() {
|
||||
return addresses;
|
||||
}
|
||||
|
||||
public void setAddresses(Set<Address> addresses) {
|
||||
this.addresses = addresses;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Embeddable
|
||||
public static class Address {
|
||||
@Basic(optional = false)
|
||||
private String street;
|
||||
@Basic(optional = false)
|
||||
private String city;
|
||||
|
||||
public Address() {
|
||||
}
|
||||
|
||||
public Address(String street, String city) {
|
||||
this.street = street;
|
||||
this.city = city;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if ( this == o ) {
|
||||
return true;
|
||||
}
|
||||
if ( o == null || getClass() != o.getClass() ) {
|
||||
return false;
|
||||
}
|
||||
Address address = (Address) o;
|
||||
return Objects.equals( street, address.street ) && Objects.equals( city, address.city );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash( street, city );
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue