HHH-7436: Reorganized many-to-many annotations tests
This commit is contained in:
parent
e40bf012fb
commit
69fda3d610
|
@ -1,52 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
import javax.persistence.Column;
|
|
||||||
import javax.persistence.Embeddable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Embeddable
|
|
||||||
public class CatPk implements Serializable {
|
|
||||||
private String name;
|
|
||||||
private String thoroughbred;
|
|
||||||
|
|
||||||
@Column(length=128)
|
|
||||||
public String getThoroughbred() {
|
|
||||||
return thoroughbred;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setThoroughbred(String thoroughbred) {
|
|
||||||
this.thoroughbred = thoroughbred;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Column(length=128)
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if ( this == o ) return true;
|
|
||||||
if ( !( o instanceof CatPk ) ) return false;
|
|
||||||
|
|
||||||
final CatPk catPk = (CatPk) o;
|
|
||||||
|
|
||||||
if ( !name.equals( catPk.name ) ) return false;
|
|
||||||
if ( !thoroughbred.equals( catPk.thoroughbred ) ) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
int result;
|
|
||||||
result = name.hashCode();
|
|
||||||
result = 29 * result + thoroughbred.hashCode();
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
@Table(name = "tbl_city")
|
|
||||||
public class City {
|
|
||||||
private Integer id;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.List;
|
|
||||||
import javax.persistence.CascadeType;
|
|
||||||
import javax.persistence.Embeddable;
|
|
||||||
import javax.persistence.ManyToMany;
|
|
||||||
|
|
||||||
@Embeddable
|
|
||||||
public class ContactInfo {
|
|
||||||
// @ManyToOne
|
|
||||||
// Address address; // Unidirectional
|
|
||||||
|
|
||||||
List<PhoneNumber> phoneNumbers; // Bidirectional
|
|
||||||
|
|
||||||
@ManyToMany(cascade= CascadeType.ALL)
|
|
||||||
public List<PhoneNumber> getPhoneNumbers() {
|
|
||||||
return phoneNumbers;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
|
|
||||||
this.phoneNumbers = phoneNumbers;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
//$Id: Employee.java 14736 2008-06-04 14:23:42Z hardy.ferentschik $
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Employee in an Employer-Employee relationship
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
@SuppressWarnings("serial")
|
|
||||||
public class Contractor extends Employee implements Serializable {
|
|
||||||
|
|
||||||
private float hourlyRate;
|
|
||||||
|
|
||||||
public float getHourlyRate() {
|
|
||||||
return hourlyRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHourlyRate(float hourlyRate) {
|
|
||||||
this.hourlyRate = hourlyRate;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,36 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import javax.persistence.Column;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Inheritance;
|
|
||||||
import javax.persistence.InheritanceType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
@Inheritance(strategy = InheritanceType.JOINED)
|
|
||||||
class Inspector implements Serializable {
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
@Column(name = "id")
|
|
||||||
private Long _id;
|
|
||||||
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return _id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import javax.persistence.CascadeType;
|
|
||||||
import javax.persistence.Embeddable;
|
|
||||||
import javax.persistence.ManyToOne;
|
|
||||||
|
|
||||||
@Embeddable
|
|
||||||
public class JobInfo {
|
|
||||||
String jobDescription;
|
|
||||||
ProgramManager pm; // Bidirectional
|
|
||||||
|
|
||||||
public String getJobDescription() {
|
|
||||||
return jobDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setJobDescription( String jobDescription ) {
|
|
||||||
this.jobDescription = jobDescription;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ManyToOne( cascade= CascadeType.ALL)
|
|
||||||
public ProgramManager getPm() {
|
|
||||||
return pm;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPm( ProgramManager pm ) {
|
|
||||||
this.pm = pm;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,44 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.Set;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.ManyToMany;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
public class KnownClient {
|
|
||||||
private Integer id;
|
|
||||||
private String name;
|
|
||||||
private Set<Store> stores;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ManyToMany(mappedBy = "customers")
|
|
||||||
public Set<Store> getStores() {
|
|
||||||
return stores;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setStores(Set<Store> stores) {
|
|
||||||
this.stores = stores;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,790 +0,0 @@
|
||||||
/*
|
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
|
||||||
*
|
|
||||||
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
|
||||||
* indicated by the @author tags or express copyright attribution
|
|
||||||
* statements applied by the authors. All third-party contributions are
|
|
||||||
* distributed under license by Red Hat Inc.
|
|
||||||
*
|
|
||||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
|
||||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
|
||||||
* Lesser General Public License, as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
|
||||||
* for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with this distribution; if not, write to:
|
|
||||||
* Free Software Foundation, Inc.
|
|
||||||
* 51 Franklin Street, Fifth Floor
|
|
||||||
* Boston, MA 02110-1301 USA
|
|
||||||
*/
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.hibernate.Hibernate;
|
|
||||||
import org.hibernate.JDBCException;
|
|
||||||
import org.hibernate.Session;
|
|
||||||
import org.hibernate.Transaction;
|
|
||||||
import org.hibernate.criterion.Restrictions;
|
|
||||||
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
|
||||||
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertNotNull;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Many to many tests
|
|
||||||
*
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@FailureExpectedWithNewMetamodel
|
|
||||||
public class ManyToManyTest
|
|
||||||
extends BaseCoreFunctionalTestCase {
|
|
||||||
@Test
|
|
||||||
public void testDefault() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Store fnac = new Store();
|
|
||||||
fnac.setName( "Fnac" );
|
|
||||||
KnownClient emmanuel = new KnownClient();
|
|
||||||
emmanuel.setName( "Emmanuel" );
|
|
||||||
emmanuel.setStores( new HashSet<Store>() );
|
|
||||||
fnac.setCustomers( new HashSet<KnownClient>() );
|
|
||||||
fnac.getCustomers().add( emmanuel );
|
|
||||||
emmanuel.getStores().add( fnac );
|
|
||||||
fnac.setImplantedIn( new HashSet<City>() );
|
|
||||||
City paris = new City();
|
|
||||||
fnac.getImplantedIn().add( paris );
|
|
||||||
paris.setName( "Paris" );
|
|
||||||
s.persist( fnac );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Store store;
|
|
||||||
KnownClient knownClient;
|
|
||||||
City city;
|
|
||||||
store = (Store) s.get( Store.class, fnac.getId() );
|
|
||||||
assertNotNull( store );
|
|
||||||
assertNotNull( store.getCustomers() );
|
|
||||||
assertEquals( 1, store.getCustomers().size() );
|
|
||||||
knownClient = store.getCustomers().iterator().next();
|
|
||||||
assertEquals( emmanuel.getName(), knownClient.getName() );
|
|
||||||
assertNotNull( store.getImplantedIn() );
|
|
||||||
assertEquals( 1, store.getImplantedIn().size() );
|
|
||||||
city = store.getImplantedIn().iterator().next();
|
|
||||||
assertEquals( paris.getName(), city.getName() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
knownClient = (KnownClient) s.get( KnownClient.class, emmanuel.getId() );
|
|
||||||
assertNotNull( knownClient );
|
|
||||||
assertNotNull( knownClient.getStores() );
|
|
||||||
assertEquals( 1, knownClient.getStores().size() );
|
|
||||||
store = knownClient.getStores().iterator().next();
|
|
||||||
assertEquals( fnac.getName(), store.getName() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCanUseCriteriaQuery() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Store fnac = new Store();
|
|
||||||
fnac.setName( "Fnac" );
|
|
||||||
Supplier emi = new Supplier();
|
|
||||||
emi.setName( "Emmanuel" );
|
|
||||||
emi.setSuppStores( new HashSet<Store>() );
|
|
||||||
fnac.setSuppliers( new HashSet<Supplier>() );
|
|
||||||
fnac.getSuppliers().add( emi );
|
|
||||||
emi.getSuppStores().add( fnac );
|
|
||||||
s.persist( fnac );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
List result = s.createCriteria( Supplier.class ).createAlias( "suppStores", "s" ).add(
|
|
||||||
Restrictions.eq( "s.name", "Fnac" ) ).list();
|
|
||||||
assertEquals( 1, result.size() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDefaultCompositePk() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
CatPk catPk = new CatPk();
|
|
||||||
catPk.setName( "Minou" );
|
|
||||||
catPk.setThoroughbred( "Persan" );
|
|
||||||
Cat cat = new Cat();
|
|
||||||
cat.setId( catPk );
|
|
||||||
cat.setAge( 32 );
|
|
||||||
Woman woman = new Woman();
|
|
||||||
WomanPk womanPk = new WomanPk();
|
|
||||||
womanPk.setFirstName( "Emma" );
|
|
||||||
womanPk.setLastName( "Peel" );
|
|
||||||
woman.setId( womanPk );
|
|
||||||
woman.setCats( new HashSet<Cat>() );
|
|
||||||
woman.getCats().add( cat );
|
|
||||||
cat.setHumanContacts( new HashSet<Woman>() );
|
|
||||||
cat.getHumanContacts().add( woman );
|
|
||||||
s.persist( woman );
|
|
||||||
s.persist( cat );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Cat sameCat = (Cat) s.get( Cat.class, cat.getId() );
|
|
||||||
assertNotNull( sameCat );
|
|
||||||
assertNotNull( sameCat.getHumanContacts() );
|
|
||||||
assertEquals( 1, sameCat.getHumanContacts().size() );
|
|
||||||
Woman sameWoman = sameCat.getHumanContacts().iterator().next();
|
|
||||||
assertEquals( sameWoman.getId().getLastName(), woman.getId().getLastName() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
sameWoman = (Woman) s.get( Woman.class, woman.getId() );
|
|
||||||
assertNotNull( sameWoman );
|
|
||||||
assertNotNull( sameWoman.getCats() );
|
|
||||||
assertEquals( 1, sameWoman.getCats().size() );
|
|
||||||
sameCat = sameWoman.getCats().iterator().next();
|
|
||||||
assertEquals( cat.getAge(), sameCat.getAge() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMappedBy() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Store fnac = new Store();
|
|
||||||
fnac.setName( "Fnac" );
|
|
||||||
Supplier emi = new Supplier();
|
|
||||||
emi.setName( "Emmanuel" );
|
|
||||||
emi.setSuppStores( new HashSet<Store>() );
|
|
||||||
fnac.setSuppliers( new HashSet<Supplier>() );
|
|
||||||
fnac.getSuppliers().add( emi );
|
|
||||||
emi.getSuppStores().add( fnac );
|
|
||||||
s.persist( fnac );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Store store;
|
|
||||||
Supplier supplier;
|
|
||||||
store = (Store) s.get( Store.class, fnac.getId() );
|
|
||||||
assertNotNull( store );
|
|
||||||
assertNotNull( store.getSuppliers() );
|
|
||||||
assertEquals( 1, store.getSuppliers().size() );
|
|
||||||
supplier = store.getSuppliers().iterator().next();
|
|
||||||
assertEquals( emi.getName(), supplier.getName() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
supplier = (Supplier) s.get( Supplier.class, emi.getId() );
|
|
||||||
assertNotNull( supplier );
|
|
||||||
assertNotNull( supplier.getSuppStores() );
|
|
||||||
assertEquals( 1, supplier.getSuppStores().size() );
|
|
||||||
store = supplier.getSuppStores().iterator().next();
|
|
||||||
assertEquals( fnac.getName(), store.getName() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testBasic() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Employer er = new Employer();
|
|
||||||
Employee ee = new Employee();
|
|
||||||
s.persist( ee );
|
|
||||||
Set erColl = new HashSet();
|
|
||||||
Collection eeColl = new ArrayList();
|
|
||||||
erColl.add( ee );
|
|
||||||
eeColl.add( er );
|
|
||||||
er.setEmployees( erColl );
|
|
||||||
ee.setEmployers( eeColl );
|
|
||||||
//s.persist(ee);
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
er = (Employer) s.load( Employer.class, er.getId() );
|
|
||||||
assertNotNull( er );
|
|
||||||
assertNotNull( er.getEmployees() );
|
|
||||||
assertEquals( 1, er.getEmployees().size() );
|
|
||||||
Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
|
|
||||||
assertEquals( ee.getId(), eeFromDb.getId() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
ee = (Employee) s.get( Employee.class, ee.getId() );
|
|
||||||
assertNotNull( ee );
|
|
||||||
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
|
||||||
tx.commit();
|
|
||||||
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
ee = (Employee) s.get( Employee.class, ee.getId() );
|
|
||||||
assertNotNull( ee );
|
|
||||||
er = ee.getEmployers().iterator().next();
|
|
||||||
assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
|
|
||||||
s.delete( er );
|
|
||||||
s.delete( ee );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testOrderByEmployee() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Employer employer = new Employer();
|
|
||||||
Employee employee1 = new Employee();
|
|
||||||
employee1.setName( "Emmanuel" );
|
|
||||||
Employee employee2 = new Employee();
|
|
||||||
employee2.setName( "Alice" );
|
|
||||||
s.persist( employee1 );
|
|
||||||
s.persist( employee2 );
|
|
||||||
Set erColl = new HashSet();
|
|
||||||
Collection eeColl = new ArrayList();
|
|
||||||
Collection eeColl2 = new ArrayList();
|
|
||||||
erColl.add( employee1 );
|
|
||||||
erColl.add( employee2 );
|
|
||||||
eeColl.add( employer );
|
|
||||||
eeColl2.add( employer );
|
|
||||||
employer.setEmployees( erColl );
|
|
||||||
employee1.setEmployers( eeColl );
|
|
||||||
employee2.setEmployers( eeColl2 );
|
|
||||||
|
|
||||||
s.flush();
|
|
||||||
s.clear();
|
|
||||||
|
|
||||||
employer = (Employer) s.get( Employer.class, employer.getId() );
|
|
||||||
assertNotNull( employer );
|
|
||||||
assertNotNull( employer.getEmployees() );
|
|
||||||
assertEquals( 2, employer.getEmployees().size() );
|
|
||||||
Employee eeFromDb = (Employee) employer.getEmployees().iterator().next();
|
|
||||||
assertEquals( employee2.getName(), eeFromDb.getName() );
|
|
||||||
tx.rollback();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// HHH-4394
|
|
||||||
@Test
|
|
||||||
public void testOrderByContractor() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
|
|
||||||
// create some test entities
|
|
||||||
Employer employer = new Employer();
|
|
||||||
Contractor contractor1 = new Contractor();
|
|
||||||
contractor1.setName( "Emmanuel" );
|
|
||||||
contractor1.setHourlyRate(100.0f);
|
|
||||||
Contractor contractor2 = new Contractor();
|
|
||||||
contractor2.setName( "Hardy" );
|
|
||||||
contractor2.setHourlyRate(99.99f);
|
|
||||||
s.persist( contractor1 );
|
|
||||||
s.persist( contractor2 );
|
|
||||||
|
|
||||||
// add contractors to employer
|
|
||||||
List setOfContractors = new ArrayList();
|
|
||||||
setOfContractors.add( contractor1 );
|
|
||||||
setOfContractors.add( contractor2 );
|
|
||||||
employer.setContractors( setOfContractors );
|
|
||||||
|
|
||||||
// add employer to contractors
|
|
||||||
Collection employerListContractor1 = new ArrayList();
|
|
||||||
employerListContractor1.add( employer );
|
|
||||||
contractor1.setEmployers( employerListContractor1 );
|
|
||||||
|
|
||||||
Collection employerListContractor2 = new ArrayList();
|
|
||||||
employerListContractor2.add( employer );
|
|
||||||
contractor2.setEmployers( employerListContractor2 );
|
|
||||||
|
|
||||||
s.flush();
|
|
||||||
s.clear();
|
|
||||||
|
|
||||||
// assertions
|
|
||||||
employer = (Employer) s.get( Employer.class, employer.getId() );
|
|
||||||
assertNotNull( employer );
|
|
||||||
assertNotNull( employer.getContractors() );
|
|
||||||
assertEquals( 2, employer.getContractors().size() );
|
|
||||||
Contractor firstContractorFromDb = (Contractor) employer.getContractors().iterator().next();
|
|
||||||
assertEquals( contractor2.getName(), firstContractorFromDb.getName() );
|
|
||||||
tx.rollback();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRemoveInBetween() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Employer er = new Employer();
|
|
||||||
Employee ee = new Employee();
|
|
||||||
Employee ee2 = new Employee();
|
|
||||||
s.persist( ee );
|
|
||||||
s.persist( ee2 );
|
|
||||||
Set erColl = new HashSet();
|
|
||||||
Collection eeColl = new ArrayList();
|
|
||||||
erColl.add( ee );
|
|
||||||
erColl.add( ee2 );
|
|
||||||
eeColl.add( er );
|
|
||||||
er.setEmployees( erColl );
|
|
||||||
ee.setEmployers( eeColl );
|
|
||||||
//s.persist(ee);
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
er = (Employer) s.load( Employer.class, er.getId() );
|
|
||||||
assertNotNull( er );
|
|
||||||
assertNotNull( er.getEmployees() );
|
|
||||||
assertEquals( 2, er.getEmployees().size() );
|
|
||||||
Iterator iterator = er.getEmployees().iterator();
|
|
||||||
Employee eeFromDb = (Employee) iterator.next();
|
|
||||||
if ( eeFromDb.getId().equals( ee.getId() ) ) {
|
|
||||||
eeFromDb = (Employee) iterator.next();
|
|
||||||
}
|
|
||||||
assertEquals( ee2.getId(), eeFromDb.getId() );
|
|
||||||
er.getEmployees().remove( eeFromDb );
|
|
||||||
eeFromDb.getEmployers().remove( er );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
ee = (Employee) s.get( Employee.class, ee.getId() );
|
|
||||||
assertNotNull( ee );
|
|
||||||
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
|
||||||
tx.commit();
|
|
||||||
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
ee = (Employee) s.get( Employee.class, ee.getId() );
|
|
||||||
assertNotNull( ee );
|
|
||||||
er = ee.getEmployers().iterator().next();
|
|
||||||
assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
|
|
||||||
assertEquals( 1, er.getEmployees().size() );
|
|
||||||
s.delete( er );
|
|
||||||
s.delete( ee );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSelf() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
Friend f = new Friend();
|
|
||||||
Friend sndF = new Friend();
|
|
||||||
f.setName( "Starsky" );
|
|
||||||
sndF.setName( "Hutch" );
|
|
||||||
Set frnds = new HashSet();
|
|
||||||
frnds.add( sndF );
|
|
||||||
f.setFriends( frnds );
|
|
||||||
//Starsky is a friend of Hutch but hutch is not
|
|
||||||
s.persist( f );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
f = (Friend) s.load( Friend.class, f.getId() );
|
|
||||||
assertNotNull( f );
|
|
||||||
assertNotNull( f.getFriends() );
|
|
||||||
assertEquals( 1, f.getFriends().size() );
|
|
||||||
Friend fromDb2ndFrnd = f.getFriends().iterator().next();
|
|
||||||
assertEquals( fromDb2ndFrnd.getId(), sndF.getId() );
|
|
||||||
assertEquals( 0, fromDb2ndFrnd.getFriends().size() );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCompositePk() throws Exception {
|
|
||||||
Session s;
|
|
||||||
Transaction tx;
|
|
||||||
|
|
||||||
ManPk m1pk = new ManPk();
|
|
||||||
m1pk.setElder( true );
|
|
||||||
m1pk.setFirstName( "Lucky" );
|
|
||||||
m1pk.setLastName( "Luke" );
|
|
||||||
ManPk m2pk = new ManPk();
|
|
||||||
m2pk.setElder( false );
|
|
||||||
m2pk.setFirstName( "Joe" );
|
|
||||||
m2pk.setLastName( "Dalton" );
|
|
||||||
|
|
||||||
Man m1 = new Man();
|
|
||||||
m1.setId( m1pk );
|
|
||||||
m1.setCarName( "Jolly Jumper" );
|
|
||||||
Man m2 = new Man();
|
|
||||||
m2.setId( m2pk );
|
|
||||||
|
|
||||||
WomanPk w1pk = new WomanPk();
|
|
||||||
w1pk.setFirstName( "Ma" );
|
|
||||||
w1pk.setLastName( "Dalton" );
|
|
||||||
WomanPk w2pk = new WomanPk();
|
|
||||||
w2pk.setFirstName( "Carla" );
|
|
||||||
w2pk.setLastName( "Bruni" );
|
|
||||||
|
|
||||||
Woman w1 = new Woman();
|
|
||||||
w1.setId( w1pk );
|
|
||||||
Woman w2 = new Woman();
|
|
||||||
w2.setId( w2pk );
|
|
||||||
|
|
||||||
Set<Woman> womens = new HashSet<Woman>();
|
|
||||||
womens.add( w1 );
|
|
||||||
m1.setWomens( womens );
|
|
||||||
Set<Woman> womens2 = new HashSet<Woman>();
|
|
||||||
womens2.add( w1 );
|
|
||||||
womens2.add( w2 );
|
|
||||||
m2.setWomens( womens2 );
|
|
||||||
|
|
||||||
Set<Man> mens = new HashSet<Man>();
|
|
||||||
mens.add( m1 );
|
|
||||||
mens.add( m2 );
|
|
||||||
w1.setMens( mens );
|
|
||||||
Set<Man> mens2 = new HashSet<Man>();
|
|
||||||
mens2.add( m2 );
|
|
||||||
w2.setMens( mens2 );
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
s.persist( m1 );
|
|
||||||
s.persist( m2 );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
m1 = (Man) s.load( Man.class, m1pk );
|
|
||||||
assertFalse( m1.getWomens().isEmpty() );
|
|
||||||
assertEquals( 1, m1.getWomens().size() );
|
|
||||||
w1 = (Woman) s.load( Woman.class, w1pk );
|
|
||||||
assertFalse( w1.getMens().isEmpty() );
|
|
||||||
assertEquals( 2, w1.getMens().size() );
|
|
||||||
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAssociationTableUniqueConstraints() throws Exception {
|
|
||||||
Session s = openSession();
|
|
||||||
Permission readAccess = new Permission();
|
|
||||||
readAccess.setPermission( "read" );
|
|
||||||
readAccess.setExpirationDate( new Date() );
|
|
||||||
Collection<Permission> coll = new ArrayList<Permission>( 2 );
|
|
||||||
coll.add( readAccess );
|
|
||||||
coll.add( readAccess );
|
|
||||||
Group group = new Group();
|
|
||||||
group.setId( new Integer( 1 ) );
|
|
||||||
group.setPermissions( coll );
|
|
||||||
s.getTransaction().begin();
|
|
||||||
try {
|
|
||||||
s.persist( group );
|
|
||||||
s.getTransaction().commit();
|
|
||||||
fail( "Unique constraints not applied on association table" );
|
|
||||||
}
|
|
||||||
catch (JDBCException e) {
|
|
||||||
//success
|
|
||||||
s.getTransaction().rollback();
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAssociationTableAndOrderBy() throws Exception {
|
|
||||||
Session s = openSession();
|
|
||||||
s.enableFilter( "Groupfilter" );
|
|
||||||
Permission readAccess = new Permission();
|
|
||||||
readAccess.setPermission( "read" );
|
|
||||||
readAccess.setExpirationDate( new Date() );
|
|
||||||
Permission writeAccess = new Permission();
|
|
||||||
writeAccess.setPermission( "write" );
|
|
||||||
writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
|
|
||||||
Collection<Permission> coll = new ArrayList<Permission>( 2 );
|
|
||||||
coll.add( readAccess );
|
|
||||||
coll.add( writeAccess );
|
|
||||||
Group group = new Group();
|
|
||||||
group.setId( new Integer( 1 ) );
|
|
||||||
group.setPermissions( coll );
|
|
||||||
s.getTransaction().begin();
|
|
||||||
s.persist( group );
|
|
||||||
s.flush();
|
|
||||||
s.clear();
|
|
||||||
group = (Group) s.get( Group.class, group.getId() );
|
|
||||||
s.createQuery( "select g from Group g join fetch g.permissions").list();
|
|
||||||
assertEquals( "write", group.getPermissions().iterator().next().getPermission() );
|
|
||||||
s.getTransaction().rollback();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testAssociationTableAndOrderByWithSet() throws Exception {
|
|
||||||
Session s = openSession();
|
|
||||||
s.enableFilter( "Groupfilter" );
|
|
||||||
|
|
||||||
Permission readAccess = new Permission();
|
|
||||||
readAccess.setPermission( "read" );
|
|
||||||
readAccess.setExpirationDate( new Date() );
|
|
||||||
|
|
||||||
Permission writeAccess = new Permission();
|
|
||||||
writeAccess.setPermission( "write" );
|
|
||||||
writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
|
|
||||||
|
|
||||||
Permission executeAccess = new Permission();
|
|
||||||
executeAccess.setPermission( "execute" );
|
|
||||||
executeAccess.setExpirationDate( new Date( new Date().getTime() - 5*60*1000 ) );
|
|
||||||
|
|
||||||
Set<Permission> coll = new HashSet<Permission>( 3 );
|
|
||||||
coll.add( readAccess );
|
|
||||||
coll.add( writeAccess );
|
|
||||||
coll.add( executeAccess );
|
|
||||||
|
|
||||||
GroupWithSet group = new GroupWithSet();
|
|
||||||
group.setId( new Integer( 1 ) );
|
|
||||||
group.setPermissions( coll );
|
|
||||||
s.getTransaction().begin();
|
|
||||||
s.persist( group );
|
|
||||||
s.flush();
|
|
||||||
s.clear();
|
|
||||||
|
|
||||||
group = (GroupWithSet) s.get( GroupWithSet.class, group.getId() );
|
|
||||||
s.createQuery( "select g from Group g join fetch g.permissions").list();
|
|
||||||
Iterator<Permission> permIter = group.getPermissions().iterator();
|
|
||||||
assertEquals( "write", permIter.next().getPermission() );
|
|
||||||
assertEquals( "execute", permIter.next().getPermission() );
|
|
||||||
assertEquals( "read", permIter.next().getPermission() );
|
|
||||||
s.getTransaction().rollback();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testJoinedSubclassManyToMany() throws Exception {
|
|
||||||
Session s = openSession();
|
|
||||||
Zone a = new Zone();
|
|
||||||
InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
|
|
||||||
Transaction tx = s.beginTransaction();
|
|
||||||
s.save( a );
|
|
||||||
s.save( ip );
|
|
||||||
ip.getAreas().add( a );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
|
|
||||||
assertNotNull( ip );
|
|
||||||
assertEquals( 1, ip.getAreas().size() );
|
|
||||||
assertEquals( a.getId(), ip.getAreas().get( 0 ).getId() );
|
|
||||||
s.delete( ip );
|
|
||||||
s.delete( ip.getAreas().get( 0 ) );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testJoinedSubclassManyToManyWithNonPkReference() throws Exception {
|
|
||||||
Session s = openSession();
|
|
||||||
Zone a = new Zone();
|
|
||||||
InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
|
|
||||||
ip.setName( "Inspector" );
|
|
||||||
Transaction tx = s.beginTransaction();
|
|
||||||
s.save( a );
|
|
||||||
s.save( ip );
|
|
||||||
ip.getDesertedAreas().add( a );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
s = openSession();
|
|
||||||
tx = s.beginTransaction();
|
|
||||||
ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
|
|
||||||
assertNotNull( ip );
|
|
||||||
assertEquals( 1, ip.getDesertedAreas().size() );
|
|
||||||
assertEquals( a.getId(), ip.getDesertedAreas().get( 0 ).getId() );
|
|
||||||
s.delete( ip );
|
|
||||||
s.delete( ip.getDesertedAreas().get( 0 ) );
|
|
||||||
tx.commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testReferencedColumnNameToSuperclass() throws Exception {
|
|
||||||
Session s = openSession();
|
|
||||||
Transaction tx = s.beginTransaction();
|
|
||||||
BuildingCompany comp = new BuildingCompany();
|
|
||||||
comp.setFoundedIn( new Date() );
|
|
||||||
comp.setName( "Builder century corp.");
|
|
||||||
s.persist( comp );
|
|
||||||
Building building = new Building();
|
|
||||||
building.setCompany( comp );
|
|
||||||
s.persist( building );
|
|
||||||
s.flush();
|
|
||||||
s.clear();
|
|
||||||
building = (Building) s.get( Building.class, building.getId() );
|
|
||||||
assertEquals( comp.getName(), building.getCompany().getName() );
|
|
||||||
tx.rollback();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@TestForIssue( jiraKey = "HHH-4685" )
|
|
||||||
public void testManyToManyEmbeddableBiDirectionalDotNotationInMappedBy() throws Exception {
|
|
||||||
// Section 11.1.25
|
|
||||||
// The ManyToMany annotation may be used within an embeddable class contained within an entity class to specify a
|
|
||||||
// relationship to a collection of entities[101]. If the relationship is bidirectional and the entity containing
|
|
||||||
// the embeddable class is the owner of the relationship, the non-owning side must use the mappedBy element of the
|
|
||||||
// ManyToMany annotation to specify the relationship field or property of the embeddable class. The dot (".")
|
|
||||||
// notation syntax must be used in the mappedBy element to indicate the relationship attribute within the embedded
|
|
||||||
// attribute. The value of each identifier used with the dot notation is the name of the respective embedded field
|
|
||||||
// or property.
|
|
||||||
Session s;
|
|
||||||
s = openSession();
|
|
||||||
s.getTransaction().begin();
|
|
||||||
Employee e = new Employee();
|
|
||||||
e.setName( "Sharon" );
|
|
||||||
List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
|
|
||||||
Collection<Employee> employees = new ArrayList<Employee>();
|
|
||||||
employees.add( e );
|
|
||||||
ContactInfo contactInfo = new ContactInfo();
|
|
||||||
PhoneNumber number = new PhoneNumber();
|
|
||||||
number.setEmployees( employees );
|
|
||||||
phoneNumbers.add( number );
|
|
||||||
contactInfo.setPhoneNumbers( phoneNumbers );
|
|
||||||
e.setContactInfo( contactInfo );
|
|
||||||
s.persist( e );
|
|
||||||
s.getTransaction().commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
s.getTransaction().begin();
|
|
||||||
e = (Employee)s.get( e.getClass(),e.getId() );
|
|
||||||
// follow both directions of many to many association
|
|
||||||
assertEquals("same employee", e.getName(), e.getContactInfo().getPhoneNumbers().get(0).getEmployees().iterator().next().getName());
|
|
||||||
s.getTransaction().commit();
|
|
||||||
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@TestForIssue( jiraKey = "HHH-4685" )
|
|
||||||
public void testOneToManyEmbeddableBiDirectionalDotNotationInMappedBy() throws Exception {
|
|
||||||
// Section 11.1.26
|
|
||||||
// The ManyToOne annotation may be used within an embeddable class to specify a relationship from the embeddable
|
|
||||||
// class to an entity class. If the relationship is bidirectional, the non-owning OneToMany entity side must use the
|
|
||||||
// mappedBy element of the OneToMany annotation to specify the relationship field or property of the embeddable field
|
|
||||||
// or property on the owning side of the relationship. The dot (".") notation syntax must be used in the mappedBy
|
|
||||||
// element to indicate the relationship attribute within the embedded attribute. The value of each identifier used
|
|
||||||
// with the dot notation is the name of the respective embedded field or property.
|
|
||||||
Session s;
|
|
||||||
s = openSession();
|
|
||||||
s.getTransaction().begin();
|
|
||||||
Employee e = new Employee();
|
|
||||||
JobInfo job = new JobInfo();
|
|
||||||
job.setJobDescription( "Sushi Chef" );
|
|
||||||
ProgramManager pm = new ProgramManager();
|
|
||||||
Collection<Employee> employees = new ArrayList<Employee>();
|
|
||||||
employees.add(e);
|
|
||||||
pm.setManages( employees );
|
|
||||||
job.setPm(pm);
|
|
||||||
e.setJobInfo( job );
|
|
||||||
s.persist( e );
|
|
||||||
s.getTransaction().commit();
|
|
||||||
s.close();
|
|
||||||
|
|
||||||
s = openSession();
|
|
||||||
s.getTransaction().begin();
|
|
||||||
e = (Employee) s.get( e.getClass(), e.getId() );
|
|
||||||
assertEquals( "same job in both directions",
|
|
||||||
e.getJobInfo().getJobDescription(),
|
|
||||||
e.getJobInfo().getPm().getManages().iterator().next().getJobInfo().getJobDescription() );
|
|
||||||
s.getTransaction().commit();
|
|
||||||
s.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Class[] getAnnotatedClasses() {
|
|
||||||
return new Class[]{
|
|
||||||
Friend.class,
|
|
||||||
Employer.class,
|
|
||||||
Employee.class,
|
|
||||||
Contractor.class,
|
|
||||||
Man.class,
|
|
||||||
Woman.class,
|
|
||||||
Store.class,
|
|
||||||
KnownClient.class,
|
|
||||||
Supplier.class,
|
|
||||||
City.class,
|
|
||||||
Cat.class,
|
|
||||||
Group.class,
|
|
||||||
GroupWithSet.class,
|
|
||||||
Permission.class,
|
|
||||||
Zone.class,
|
|
||||||
Inspector.class,
|
|
||||||
InspectorPrefixes.class,
|
|
||||||
BuildingCompany.class,
|
|
||||||
Building.class,
|
|
||||||
PhoneNumber.class,
|
|
||||||
ProgramManager.class
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.Date;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
public class Permission {
|
|
||||||
private String permission;
|
|
||||||
private Date expirationDate;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
public String getPermission() {
|
|
||||||
return permission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPermission(String permission) {
|
|
||||||
this.permission = permission;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Date getExpirationDate() {
|
|
||||||
return expirationDate;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setExpirationDate(Date expirationDate) {
|
|
||||||
this.expirationDate = expirationDate;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.Collection;
|
|
||||||
import javax.persistence.CascadeType;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.ManyToMany;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
public class PhoneNumber {
|
|
||||||
int phNumber;
|
|
||||||
Collection<Employee> employees;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
public int getPhNumber() {
|
|
||||||
return phNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPhNumber(int phNumber) {
|
|
||||||
this.phNumber = phNumber;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ManyToMany(mappedBy="contactInfo.phoneNumbers", cascade= CascadeType.ALL)
|
|
||||||
public Collection<Employee> getEmployees() {
|
|
||||||
return employees;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setEmployees(Collection<Employee> employees) {
|
|
||||||
this.employees = employees;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.Collection;
|
|
||||||
import javax.persistence.CascadeType;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.OneToMany;
|
|
||||||
|
|
||||||
@Entity
|
|
||||||
public class ProgramManager {
|
|
||||||
int id;
|
|
||||||
|
|
||||||
Collection<Employee> manages;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
public int getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(int id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@OneToMany( mappedBy="jobInfo.pm", cascade= CascadeType.ALL )
|
|
||||||
public Collection<Employee> getManages() {
|
|
||||||
return manages;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setManages( Collection<Employee> manages ) {
|
|
||||||
this.manages = manages;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.Set;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.ManyToMany;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
public class Supplier {
|
|
||||||
private Integer id;
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Set<Store> suppStores;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ManyToMany(mappedBy = "suppliers")
|
|
||||||
public Set<Store> getSuppStores() {
|
|
||||||
return suppStores;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSuppStores(Set<Store> suppStores) {
|
|
||||||
this.suppStores = suppStores;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import javax.persistence.Column;
|
|
||||||
import javax.persistence.Embeddable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Embeddable
|
|
||||||
public class WomanPk implements Serializable {
|
|
||||||
|
|
||||||
|
|
||||||
private String firstName;
|
|
||||||
private String lastName;
|
|
||||||
|
|
||||||
public int hashCode() {
|
|
||||||
//this implem sucks
|
|
||||||
return getFirstName().hashCode() + getLastName().hashCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
//firstName and lastName are expected to be set in this implem
|
|
||||||
if ( obj != null && obj instanceof WomanPk ) {
|
|
||||||
WomanPk other = (WomanPk) obj;
|
|
||||||
return getFirstName().equals( other.getFirstName() )
|
|
||||||
&& getLastName().equals( other.getLastName() );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFirstName(String firstName) {
|
|
||||||
this.firstName = firstName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLastName(String lastName) {
|
|
||||||
this.lastName = lastName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Column(length=128)
|
|
||||||
public String getFirstName() {
|
|
||||||
return firstName;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Column(length=128)
|
|
||||||
public String getLastName() {
|
|
||||||
return lastName;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
//$Id$
|
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import javax.persistence.Column;
|
|
||||||
import javax.persistence.Entity;
|
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Emmanuel Bernard
|
|
||||||
*/
|
|
||||||
@Entity
|
|
||||||
@Table(name="`Zone`")
|
|
||||||
public class Zone {
|
|
||||||
private Integer id;
|
|
||||||
|
|
||||||
@Id
|
|
||||||
@GeneratedValue
|
|
||||||
@Column(name = "id")
|
|
||||||
public Integer getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Integer id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.associationtable;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.associationtable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -0,0 +1,152 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.associationtable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.JDBCException;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManyAssociationTableTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssociationTableUniqueConstraints() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Permission readAccess = new Permission();
|
||||||
|
readAccess.setPermission( "read" );
|
||||||
|
readAccess.setExpirationDate( new Date() );
|
||||||
|
Collection<Permission> coll = new ArrayList<Permission>( 2 );
|
||||||
|
coll.add( readAccess );
|
||||||
|
coll.add( readAccess );
|
||||||
|
Group group = new Group();
|
||||||
|
group.setId( new Integer( 1 ) );
|
||||||
|
group.setPermissions( coll );
|
||||||
|
s.getTransaction().begin();
|
||||||
|
try {
|
||||||
|
s.persist( group );
|
||||||
|
s.getTransaction().commit();
|
||||||
|
fail( "Unique constraints not applied on association table" );
|
||||||
|
}
|
||||||
|
catch (JDBCException e) {
|
||||||
|
//success
|
||||||
|
s.getTransaction().rollback();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssociationTableAndOrderBy() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
s.enableFilter( "Groupfilter" );
|
||||||
|
Permission readAccess = new Permission();
|
||||||
|
readAccess.setPermission( "read" );
|
||||||
|
readAccess.setExpirationDate( new Date() );
|
||||||
|
Permission writeAccess = new Permission();
|
||||||
|
writeAccess.setPermission( "write" );
|
||||||
|
writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
|
||||||
|
Collection<Permission> coll = new ArrayList<Permission>( 2 );
|
||||||
|
coll.add( readAccess );
|
||||||
|
coll.add( writeAccess );
|
||||||
|
Group group = new Group();
|
||||||
|
group.setId( new Integer( 1 ) );
|
||||||
|
group.setPermissions( coll );
|
||||||
|
s.getTransaction().begin();
|
||||||
|
s.persist( group );
|
||||||
|
s.flush();
|
||||||
|
s.clear();
|
||||||
|
group = (Group) s.get( Group.class, group.getId() );
|
||||||
|
s.createQuery( "select g from Group g join fetch g.permissions").list();
|
||||||
|
assertEquals( "write", group.getPermissions().iterator().next().getPermission() );
|
||||||
|
s.getTransaction().rollback();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAssociationTableAndOrderByWithSet() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
s.enableFilter( "Groupfilter" );
|
||||||
|
|
||||||
|
Permission readAccess = new Permission();
|
||||||
|
readAccess.setPermission( "read" );
|
||||||
|
readAccess.setExpirationDate( new Date() );
|
||||||
|
|
||||||
|
Permission writeAccess = new Permission();
|
||||||
|
writeAccess.setPermission( "write" );
|
||||||
|
writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
|
||||||
|
|
||||||
|
Permission executeAccess = new Permission();
|
||||||
|
executeAccess.setPermission( "execute" );
|
||||||
|
executeAccess.setExpirationDate( new Date( new Date().getTime() - 5*60*1000 ) );
|
||||||
|
|
||||||
|
Set<Permission> coll = new HashSet<Permission>( 3 );
|
||||||
|
coll.add( readAccess );
|
||||||
|
coll.add( writeAccess );
|
||||||
|
coll.add( executeAccess );
|
||||||
|
|
||||||
|
GroupWithSet group = new GroupWithSet();
|
||||||
|
group.setId( new Integer( 1 ) );
|
||||||
|
group.setPermissions( coll );
|
||||||
|
s.getTransaction().begin();
|
||||||
|
s.persist( group );
|
||||||
|
s.flush();
|
||||||
|
s.clear();
|
||||||
|
|
||||||
|
group = (GroupWithSet) s.get( GroupWithSet.class, group.getId() );
|
||||||
|
s.createQuery( "select g from Group g join fetch g.permissions").list();
|
||||||
|
Iterator<Permission> permIter = group.getPermissions().iterator();
|
||||||
|
assertEquals( "write", permIter.next().getPermission() );
|
||||||
|
assertEquals( "execute", permIter.next().getPermission() );
|
||||||
|
assertEquals( "read", permIter.next().getPermission() );
|
||||||
|
s.getTransaction().rollback();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Group.class,
|
||||||
|
GroupWithSet.class,
|
||||||
|
Permission.class
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.associationtable;
|
||||||
|
import java.util.Date;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class Permission {
|
||||||
|
private String permission;
|
||||||
|
private Date expirationDate;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
public String getPermission() {
|
||||||
|
return permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPermission(String permission) {
|
||||||
|
this.permission = permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getExpirationDate() {
|
||||||
|
return expirationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpirationDate(Date expirationDate) {
|
||||||
|
this.expirationDate = expirationDate;
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,7 @@
|
||||||
* 51 Franklin Street, Fifth Floor
|
* 51 Franklin Street, Fifth Floor
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.annotations.manytomany;
|
package org.hibernate.test.annotations.manytomany.colrefsuper;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
|
@ -21,7 +21,7 @@
|
||||||
* 51 Franklin Street, Fifth Floor
|
* 51 Franklin Street, Fifth Floor
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.annotations.manytomany;
|
package org.hibernate.test.annotations.manytomany.colrefsuper;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -21,7 +21,7 @@
|
||||||
* 51 Franklin Street, Fifth Floor
|
* 51 Franklin Street, Fifth Floor
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.annotations.manytomany;
|
package org.hibernate.test.annotations.manytomany.colrefsuper;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.colrefsuper;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
public class ManyToManyReferencedColumnToSuperclassTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testReferencedColumnNameToSuperclass() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Transaction tx = s.beginTransaction();
|
||||||
|
BuildingCompany comp = new BuildingCompany();
|
||||||
|
comp.setFoundedIn( new Date() );
|
||||||
|
comp.setName( "Builder century corp.");
|
||||||
|
s.persist( comp );
|
||||||
|
Building building = new Building();
|
||||||
|
building.setCompany( comp );
|
||||||
|
s.persist( building );
|
||||||
|
s.flush();
|
||||||
|
s.clear();
|
||||||
|
building = (Building) s.get( Building.class, building.getId() );
|
||||||
|
assertEquals( comp.getName(), building.getCompany().getName() );
|
||||||
|
tx.rollback();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
BuildingCompany.class,
|
||||||
|
Building.class
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public class ContactInfo {
|
||||||
|
// @ManyToOne
|
||||||
|
// Address address; // Unidirectional
|
||||||
|
|
||||||
|
List<PhoneNumber> phoneNumbers; // Bidirectional
|
||||||
|
|
||||||
|
@ManyToMany(cascade= CascadeType.ALL)
|
||||||
|
public List<PhoneNumber> getPhoneNumbers() {
|
||||||
|
return phoneNumbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhoneNumbers(List<PhoneNumber> phoneNumbers) {
|
||||||
|
this.phoneNumbers = phoneNumbers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Employee in an Employer-Employee relationship
|
||||||
|
*
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class Contractor extends Employee implements Serializable {
|
||||||
|
|
||||||
|
private float hourlyRate;
|
||||||
|
|
||||||
|
public float getHourlyRate() {
|
||||||
|
return hourlyRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHourlyRate(float hourlyRate) {
|
||||||
|
this.hourlyRate = hourlyRate;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -29,7 +51,7 @@ public class Employer implements Serializable {
|
||||||
private List contractors;
|
private List contractors;
|
||||||
|
|
||||||
@ManyToMany(
|
@ManyToMany(
|
||||||
targetEntity = org.hibernate.test.annotations.manytomany.Contractor.class,
|
targetEntity = Contractor.class,
|
||||||
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
|
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
|
||||||
)
|
)
|
||||||
@JoinTable(
|
@JoinTable(
|
||||||
|
@ -48,7 +70,7 @@ public class Employer implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ManyToMany(
|
@ManyToMany(
|
||||||
targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
|
targetEntity = Employee.class,
|
||||||
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
|
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
|
||||||
)
|
)
|
||||||
@JoinTable(
|
@JoinTable(
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
import javax.persistence.ManyToOne;
|
||||||
|
|
||||||
|
@Embeddable
|
||||||
|
public class JobInfo {
|
||||||
|
String jobDescription;
|
||||||
|
ProgramManager pm; // Bidirectional
|
||||||
|
|
||||||
|
public String getJobDescription() {
|
||||||
|
return jobDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setJobDescription( String jobDescription ) {
|
||||||
|
this.jobDescription = jobDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToOne( cascade= CascadeType.ALL)
|
||||||
|
public ProgramManager getPm() {
|
||||||
|
return pm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPm( ProgramManager pm ) {
|
||||||
|
this.pm = pm;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,340 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Hibernate;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.TestForIssue;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Many to many tests
|
||||||
|
*
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManyComplexTest
|
||||||
|
extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBasic() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Employer er = new Employer();
|
||||||
|
Employee ee = new Employee();
|
||||||
|
s.persist( ee );
|
||||||
|
Set erColl = new HashSet();
|
||||||
|
Collection eeColl = new ArrayList();
|
||||||
|
erColl.add( ee );
|
||||||
|
eeColl.add( er );
|
||||||
|
er.setEmployees( erColl );
|
||||||
|
ee.setEmployers( eeColl );
|
||||||
|
//s.persist(ee);
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
er = (Employer) s.load( Employer.class, er.getId() );
|
||||||
|
assertNotNull( er );
|
||||||
|
assertNotNull( er.getEmployees() );
|
||||||
|
assertEquals( 1, er.getEmployees().size() );
|
||||||
|
Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
|
||||||
|
assertEquals( ee.getId(), eeFromDb.getId() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ee = (Employee) s.get( Employee.class, ee.getId() );
|
||||||
|
assertNotNull( ee );
|
||||||
|
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
||||||
|
tx.commit();
|
||||||
|
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ee = (Employee) s.get( Employee.class, ee.getId() );
|
||||||
|
assertNotNull( ee );
|
||||||
|
er = ee.getEmployers().iterator().next();
|
||||||
|
assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
|
||||||
|
s.delete( er );
|
||||||
|
s.delete( ee );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOrderByEmployee() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Employer employer = new Employer();
|
||||||
|
Employee employee1 = new Employee();
|
||||||
|
employee1.setName( "Emmanuel" );
|
||||||
|
Employee employee2 = new Employee();
|
||||||
|
employee2.setName( "Alice" );
|
||||||
|
s.persist( employee1 );
|
||||||
|
s.persist( employee2 );
|
||||||
|
Set erColl = new HashSet();
|
||||||
|
Collection eeColl = new ArrayList();
|
||||||
|
Collection eeColl2 = new ArrayList();
|
||||||
|
erColl.add( employee1 );
|
||||||
|
erColl.add( employee2 );
|
||||||
|
eeColl.add( employer );
|
||||||
|
eeColl2.add( employer );
|
||||||
|
employer.setEmployees( erColl );
|
||||||
|
employee1.setEmployers( eeColl );
|
||||||
|
employee2.setEmployers( eeColl2 );
|
||||||
|
|
||||||
|
s.flush();
|
||||||
|
s.clear();
|
||||||
|
|
||||||
|
employer = (Employer) s.get( Employer.class, employer.getId() );
|
||||||
|
assertNotNull( employer );
|
||||||
|
assertNotNull( employer.getEmployees() );
|
||||||
|
assertEquals( 2, employer.getEmployees().size() );
|
||||||
|
Employee eeFromDb = (Employee) employer.getEmployees().iterator().next();
|
||||||
|
assertEquals( employee2.getName(), eeFromDb.getName() );
|
||||||
|
tx.rollback();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// HHH-4394
|
||||||
|
@Test
|
||||||
|
public void testOrderByContractor() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
|
||||||
|
// create some test entities
|
||||||
|
Employer employer = new Employer();
|
||||||
|
Contractor contractor1 = new Contractor();
|
||||||
|
contractor1.setName( "Emmanuel" );
|
||||||
|
contractor1.setHourlyRate(100.0f);
|
||||||
|
Contractor contractor2 = new Contractor();
|
||||||
|
contractor2.setName( "Hardy" );
|
||||||
|
contractor2.setHourlyRate(99.99f);
|
||||||
|
s.persist( contractor1 );
|
||||||
|
s.persist( contractor2 );
|
||||||
|
|
||||||
|
// add contractors to employer
|
||||||
|
List setOfContractors = new ArrayList();
|
||||||
|
setOfContractors.add( contractor1 );
|
||||||
|
setOfContractors.add( contractor2 );
|
||||||
|
employer.setContractors( setOfContractors );
|
||||||
|
|
||||||
|
// add employer to contractors
|
||||||
|
Collection employerListContractor1 = new ArrayList();
|
||||||
|
employerListContractor1.add( employer );
|
||||||
|
contractor1.setEmployers( employerListContractor1 );
|
||||||
|
|
||||||
|
Collection employerListContractor2 = new ArrayList();
|
||||||
|
employerListContractor2.add( employer );
|
||||||
|
contractor2.setEmployers( employerListContractor2 );
|
||||||
|
|
||||||
|
s.flush();
|
||||||
|
s.clear();
|
||||||
|
|
||||||
|
// assertions
|
||||||
|
employer = (Employer) s.get( Employer.class, employer.getId() );
|
||||||
|
assertNotNull( employer );
|
||||||
|
assertNotNull( employer.getContractors() );
|
||||||
|
assertEquals( 2, employer.getContractors().size() );
|
||||||
|
Contractor firstContractorFromDb = (Contractor) employer.getContractors().iterator().next();
|
||||||
|
assertEquals( contractor2.getName(), firstContractorFromDb.getName() );
|
||||||
|
tx.rollback();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRemoveInBetween() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Employer er = new Employer();
|
||||||
|
Employee ee = new Employee();
|
||||||
|
Employee ee2 = new Employee();
|
||||||
|
s.persist( ee );
|
||||||
|
s.persist( ee2 );
|
||||||
|
Set erColl = new HashSet();
|
||||||
|
Collection eeColl = new ArrayList();
|
||||||
|
erColl.add( ee );
|
||||||
|
erColl.add( ee2 );
|
||||||
|
eeColl.add( er );
|
||||||
|
er.setEmployees( erColl );
|
||||||
|
ee.setEmployers( eeColl );
|
||||||
|
//s.persist(ee);
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
er = (Employer) s.load( Employer.class, er.getId() );
|
||||||
|
assertNotNull( er );
|
||||||
|
assertNotNull( er.getEmployees() );
|
||||||
|
assertEquals( 2, er.getEmployees().size() );
|
||||||
|
Iterator iterator = er.getEmployees().iterator();
|
||||||
|
Employee eeFromDb = (Employee) iterator.next();
|
||||||
|
if ( eeFromDb.getId().equals( ee.getId() ) ) {
|
||||||
|
eeFromDb = (Employee) iterator.next();
|
||||||
|
}
|
||||||
|
assertEquals( ee2.getId(), eeFromDb.getId() );
|
||||||
|
er.getEmployees().remove( eeFromDb );
|
||||||
|
eeFromDb.getEmployers().remove( er );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ee = (Employee) s.get( Employee.class, ee.getId() );
|
||||||
|
assertNotNull( ee );
|
||||||
|
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
||||||
|
tx.commit();
|
||||||
|
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ee = (Employee) s.get( Employee.class, ee.getId() );
|
||||||
|
assertNotNull( ee );
|
||||||
|
er = ee.getEmployers().iterator().next();
|
||||||
|
assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
|
||||||
|
assertEquals( 1, er.getEmployees().size() );
|
||||||
|
s.delete( er );
|
||||||
|
s.delete( ee );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-4685" )
|
||||||
|
public void testManyToManyEmbeddableBiDirectionalDotNotationInMappedBy() throws Exception {
|
||||||
|
// Section 11.1.25
|
||||||
|
// The ManyToMany annotation may be used within an embeddable class contained within an entity class to specify a
|
||||||
|
// relationship to a collection of entities[101]. If the relationship is bidirectional and the entity containing
|
||||||
|
// the embeddable class is the owner of the relationship, the non-owning side must use the mappedBy element of the
|
||||||
|
// ManyToMany annotation to specify the relationship field or property of the embeddable class. The dot (".")
|
||||||
|
// notation syntax must be used in the mappedBy element to indicate the relationship attribute within the embedded
|
||||||
|
// attribute. The value of each identifier used with the dot notation is the name of the respective embedded field
|
||||||
|
// or property.
|
||||||
|
Session s;
|
||||||
|
s = openSession();
|
||||||
|
s.getTransaction().begin();
|
||||||
|
Employee e = new Employee();
|
||||||
|
e.setName( "Sharon" );
|
||||||
|
List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
|
||||||
|
Collection<Employee> employees = new ArrayList<Employee>();
|
||||||
|
employees.add( e );
|
||||||
|
ContactInfo contactInfo = new ContactInfo();
|
||||||
|
PhoneNumber number = new PhoneNumber();
|
||||||
|
number.setEmployees( employees );
|
||||||
|
phoneNumbers.add( number );
|
||||||
|
contactInfo.setPhoneNumbers( phoneNumbers );
|
||||||
|
e.setContactInfo( contactInfo );
|
||||||
|
s.persist( e );
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.getTransaction().begin();
|
||||||
|
e = (Employee)s.get( e.getClass(),e.getId() );
|
||||||
|
// follow both directions of many to many association
|
||||||
|
assertEquals("same employee", e.getName(), e.getContactInfo().getPhoneNumbers().get(0).getEmployees().iterator().next().getName());
|
||||||
|
s.getTransaction().commit();
|
||||||
|
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestForIssue( jiraKey = "HHH-4685" )
|
||||||
|
public void testOneToManyEmbeddableBiDirectionalDotNotationInMappedBy() throws Exception {
|
||||||
|
// Section 11.1.26
|
||||||
|
// The ManyToOne annotation may be used within an embeddable class to specify a relationship from the embeddable
|
||||||
|
// class to an entity class. If the relationship is bidirectional, the non-owning OneToMany entity side must use the
|
||||||
|
// mappedBy element of the OneToMany annotation to specify the relationship field or property of the embeddable field
|
||||||
|
// or property on the owning side of the relationship. The dot (".") notation syntax must be used in the mappedBy
|
||||||
|
// element to indicate the relationship attribute within the embedded attribute. The value of each identifier used
|
||||||
|
// with the dot notation is the name of the respective embedded field or property.
|
||||||
|
Session s;
|
||||||
|
s = openSession();
|
||||||
|
s.getTransaction().begin();
|
||||||
|
Employee e = new Employee();
|
||||||
|
JobInfo job = new JobInfo();
|
||||||
|
job.setJobDescription( "Sushi Chef" );
|
||||||
|
ProgramManager pm = new ProgramManager();
|
||||||
|
Collection<Employee> employees = new ArrayList<Employee>();
|
||||||
|
employees.add(e);
|
||||||
|
pm.setManages( employees );
|
||||||
|
job.setPm(pm);
|
||||||
|
e.setJobInfo( job );
|
||||||
|
s.persist( e );
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
s.getTransaction().begin();
|
||||||
|
e = (Employee) s.get( e.getClass(), e.getId() );
|
||||||
|
assertEquals( "same job in both directions",
|
||||||
|
e.getJobInfo().getJobDescription(),
|
||||||
|
e.getJobInfo().getPm().getManages().iterator().next().getJobInfo().getJobDescription() );
|
||||||
|
s.getTransaction().commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Employer.class,
|
||||||
|
Employee.class,
|
||||||
|
Contractor.class,
|
||||||
|
PhoneNumber.class,
|
||||||
|
ProgramManager.class
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -22,7 +22,7 @@
|
||||||
* Boston, MA 02110-1301 USA
|
* Boston, MA 02110-1301 USA
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
package org.hibernate.test.annotations.manytomany;
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
|
||||||
import org.hibernate.cfg.Configuration;
|
import org.hibernate.cfg.Configuration;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
@ -35,7 +35,7 @@ import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@FailureExpectedWithNewMetamodel
|
@FailureExpectedWithNewMetamodel
|
||||||
public class ManyToManyMaxFetchDepth0Test extends ManyToManyTest {
|
public class ManyToManyMaxFetchDepth0Test extends ManyToManyComplexTest {
|
||||||
@Override
|
@Override
|
||||||
protected void configure(Configuration cfg) {
|
protected void configure(Configuration cfg) {
|
||||||
cfg.setProperty( Environment.MAX_FETCH_DEPTH, "0" );
|
cfg.setProperty( Environment.MAX_FETCH_DEPTH, "0" );
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
import java.util.Collection;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class PhoneNumber {
|
||||||
|
int phNumber;
|
||||||
|
Collection<Employee> employees;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
public int getPhNumber() {
|
||||||
|
return phNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPhNumber(int phNumber) {
|
||||||
|
this.phNumber = phNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy="contactInfo.phoneNumbers", cascade= CascadeType.ALL)
|
||||||
|
public Collection<Employee> getEmployees() {
|
||||||
|
return employees;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployees(Collection<Employee> employees) {
|
||||||
|
this.employees = employees;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.complex;
|
||||||
|
import java.util.Collection;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.OneToMany;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
public class ProgramManager {
|
||||||
|
int id;
|
||||||
|
|
||||||
|
Collection<Employee> manages;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@OneToMany( mappedBy="jobInfo.pm", cascade= CascadeType.ALL )
|
||||||
|
public Collection<Employee> getManages() {
|
||||||
|
return manages;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setManages( Collection<Employee> manages ) {
|
||||||
|
this.manages = manages;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.EmbeddedId;
|
import javax.persistence.EmbeddedId;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Embeddable
|
||||||
|
public class CatPk implements Serializable {
|
||||||
|
private String name;
|
||||||
|
private String thoroughbred;
|
||||||
|
|
||||||
|
@Column(length=128)
|
||||||
|
public String getThoroughbred() {
|
||||||
|
return thoroughbred;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setThoroughbred(String thoroughbred) {
|
||||||
|
this.thoroughbred = thoroughbred;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column(length=128)
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if ( this == o ) return true;
|
||||||
|
if ( !( o instanceof CatPk ) ) return false;
|
||||||
|
|
||||||
|
final CatPk catPk = (CatPk) o;
|
||||||
|
|
||||||
|
if ( !name.equals( catPk.name ) ) return false;
|
||||||
|
if ( !thoroughbred.equals( catPk.thoroughbred ) ) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
int result;
|
||||||
|
result = name.hashCode();
|
||||||
|
result = 29 * result + thoroughbred.hashCode();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
||||||
import javax.persistence.Embeddable;
|
import javax.persistence.Embeddable;
|
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManyCompositePkTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testDefaultCompositePk() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
CatPk catPk = new CatPk();
|
||||||
|
catPk.setName( "Minou" );
|
||||||
|
catPk.setThoroughbred( "Persan" );
|
||||||
|
Cat cat = new Cat();
|
||||||
|
cat.setId( catPk );
|
||||||
|
cat.setAge( 32 );
|
||||||
|
Woman woman = new Woman();
|
||||||
|
WomanPk womanPk = new WomanPk();
|
||||||
|
womanPk.setFirstName( "Emma" );
|
||||||
|
womanPk.setLastName( "Peel" );
|
||||||
|
woman.setId( womanPk );
|
||||||
|
woman.setCats( new HashSet<Cat>() );
|
||||||
|
woman.getCats().add( cat );
|
||||||
|
cat.setHumanContacts( new HashSet<Woman>() );
|
||||||
|
cat.getHumanContacts().add( woman );
|
||||||
|
s.persist( woman );
|
||||||
|
s.persist( cat );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Cat sameCat = (Cat) s.get( Cat.class, cat.getId() );
|
||||||
|
assertNotNull( sameCat );
|
||||||
|
assertNotNull( sameCat.getHumanContacts() );
|
||||||
|
assertEquals( 1, sameCat.getHumanContacts().size() );
|
||||||
|
Woman sameWoman = sameCat.getHumanContacts().iterator().next();
|
||||||
|
assertEquals( sameWoman.getId().getLastName(), woman.getId().getLastName() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
sameWoman = (Woman) s.get( Woman.class, woman.getId() );
|
||||||
|
assertNotNull( sameWoman );
|
||||||
|
assertNotNull( sameWoman.getCats() );
|
||||||
|
assertEquals( 1, sameWoman.getCats().size() );
|
||||||
|
sameCat = sameWoman.getCats().iterator().next();
|
||||||
|
assertEquals( cat.getAge(), sameCat.getAge() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCompositePk() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
|
||||||
|
ManPk m1pk = new ManPk();
|
||||||
|
m1pk.setElder( true );
|
||||||
|
m1pk.setFirstName( "Lucky" );
|
||||||
|
m1pk.setLastName( "Luke" );
|
||||||
|
ManPk m2pk = new ManPk();
|
||||||
|
m2pk.setElder( false );
|
||||||
|
m2pk.setFirstName( "Joe" );
|
||||||
|
m2pk.setLastName( "Dalton" );
|
||||||
|
|
||||||
|
Man m1 = new Man();
|
||||||
|
m1.setId( m1pk );
|
||||||
|
m1.setCarName( "Jolly Jumper" );
|
||||||
|
Man m2 = new Man();
|
||||||
|
m2.setId( m2pk );
|
||||||
|
|
||||||
|
WomanPk w1pk = new WomanPk();
|
||||||
|
w1pk.setFirstName( "Ma" );
|
||||||
|
w1pk.setLastName( "Dalton" );
|
||||||
|
WomanPk w2pk = new WomanPk();
|
||||||
|
w2pk.setFirstName( "Carla" );
|
||||||
|
w2pk.setLastName( "Bruni" );
|
||||||
|
|
||||||
|
Woman w1 = new Woman();
|
||||||
|
w1.setId( w1pk );
|
||||||
|
Woman w2 = new Woman();
|
||||||
|
w2.setId( w2pk );
|
||||||
|
|
||||||
|
Set<Woman> womens = new HashSet<Woman>();
|
||||||
|
womens.add( w1 );
|
||||||
|
m1.setWomens( womens );
|
||||||
|
Set<Woman> womens2 = new HashSet<Woman>();
|
||||||
|
womens2.add( w1 );
|
||||||
|
womens2.add( w2 );
|
||||||
|
m2.setWomens( womens2 );
|
||||||
|
|
||||||
|
Set<Man> mens = new HashSet<Man>();
|
||||||
|
mens.add( m1 );
|
||||||
|
mens.add( m2 );
|
||||||
|
w1.setMens( mens );
|
||||||
|
Set<Man> mens2 = new HashSet<Man>();
|
||||||
|
mens2.add( m2 );
|
||||||
|
w2.setMens( mens2 );
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
s.persist( m1 );
|
||||||
|
s.persist( m2 );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
m1 = (Man) s.load( Man.class, m1pk );
|
||||||
|
assertFalse( m1.getWomens().isEmpty() );
|
||||||
|
assertEquals( 1, m1.getWomens().size() );
|
||||||
|
w1 = (Woman) s.load( Woman.class, w1pk );
|
||||||
|
assertFalse( w1.getMens().isEmpty() );
|
||||||
|
assertEquals( 2, w1.getMens().size() );
|
||||||
|
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Man.class,
|
||||||
|
Woman.class,
|
||||||
|
Cat.class,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.compositepk;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Embeddable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Embeddable
|
||||||
|
public class WomanPk implements Serializable {
|
||||||
|
|
||||||
|
|
||||||
|
private String firstName;
|
||||||
|
private String lastName;
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
//this implem sucks
|
||||||
|
return getFirstName().hashCode() + getLastName().hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
//firstName and lastName are expected to be set in this implem
|
||||||
|
if ( obj != null && obj instanceof WomanPk ) {
|
||||||
|
WomanPk other = (WomanPk) obj;
|
||||||
|
return getFirstName().equals( other.getFirstName() )
|
||||||
|
&& getLastName().equals( other.getLastName() );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column(length=128)
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Column(length=128)
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.joinedsubclass;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Inheritance;
|
||||||
|
import javax.persistence.InheritanceType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Inheritance(strategy = InheritanceType.JOINED)
|
||||||
|
class Inspector implements Serializable {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
@Column(name = "id")
|
||||||
|
private Long _id;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
//$Id$
|
package org.hibernate.test.annotations.manytomany.joinedsubclass;
|
||||||
package org.hibernate.test.annotations.manytomany;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.persistence.Column;
|
import javax.persistence.Column;
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.joinedsubclass;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManyJoinedSubclassTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJoinedSubclassManyToMany() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Zone a = new Zone();
|
||||||
|
InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
|
||||||
|
Transaction tx = s.beginTransaction();
|
||||||
|
s.save( a );
|
||||||
|
s.save( ip );
|
||||||
|
ip.getAreas().add( a );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
|
||||||
|
assertNotNull( ip );
|
||||||
|
assertEquals( 1, ip.getAreas().size() );
|
||||||
|
assertEquals( a.getId(), ip.getAreas().get( 0 ).getId() );
|
||||||
|
s.delete( ip );
|
||||||
|
s.delete( ip.getAreas().get( 0 ) );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJoinedSubclassManyToManyWithNonPkReference() throws Exception {
|
||||||
|
Session s = openSession();
|
||||||
|
Zone a = new Zone();
|
||||||
|
InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
|
||||||
|
ip.setName( "Inspector" );
|
||||||
|
Transaction tx = s.beginTransaction();
|
||||||
|
s.save( a );
|
||||||
|
s.save( ip );
|
||||||
|
ip.getDesertedAreas().add( a );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
|
||||||
|
assertNotNull( ip );
|
||||||
|
assertEquals( 1, ip.getDesertedAreas().size() );
|
||||||
|
assertEquals( a.getId(), ip.getDesertedAreas().get( 0 ).getId() );
|
||||||
|
s.delete( ip );
|
||||||
|
s.delete( ip.getDesertedAreas().get( 0 ) );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Zone.class,
|
||||||
|
Inspector.class,
|
||||||
|
InspectorPrefixes.class,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.joinedsubclass;
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name="`Zone`")
|
||||||
|
public class Zone {
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
@Column(name = "id")
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.self;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.self;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManySelfReferenceTest extends BaseCoreFunctionalTestCase {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSelf() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Friend f = new Friend();
|
||||||
|
Friend sndF = new Friend();
|
||||||
|
f.setName( "Starsky" );
|
||||||
|
sndF.setName( "Hutch" );
|
||||||
|
Set frnds = new HashSet();
|
||||||
|
frnds.add( sndF );
|
||||||
|
f.setFriends( frnds );
|
||||||
|
//Starsky is a friend of Hutch but hutch is not
|
||||||
|
s.persist( f );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
f = (Friend) s.load( Friend.class, f.getId() );
|
||||||
|
assertNotNull( f );
|
||||||
|
assertNotNull( f.getFriends() );
|
||||||
|
assertEquals( 1, f.getFriends().size() );
|
||||||
|
Friend fromDb2ndFrnd = f.getFriends().iterator().next();
|
||||||
|
assertEquals( fromDb2ndFrnd.getId(), sndF.getId() );
|
||||||
|
assertEquals( 0, fromDb2ndFrnd.getFriends().size() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Friend.class,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.simple;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name = "tbl_city")
|
||||||
|
public class City {
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.simple;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class KnownClient {
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
private Set<Store> stores;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy = "customers")
|
||||||
|
public Set<Store> getStores() {
|
||||||
|
return stores;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStores(Set<Store> stores) {
|
||||||
|
this.stores = stores;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.simple;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.criterion.Restrictions;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManySimpleTest extends BaseCoreFunctionalTestCase {
|
||||||
|
@Test
|
||||||
|
public void testDefault() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Store fnac = new Store();
|
||||||
|
fnac.setName( "Fnac" );
|
||||||
|
KnownClient emmanuel = new KnownClient();
|
||||||
|
emmanuel.setName( "Emmanuel" );
|
||||||
|
emmanuel.setStores( new HashSet<Store>() );
|
||||||
|
fnac.setCustomers( new HashSet<KnownClient>() );
|
||||||
|
fnac.getCustomers().add( emmanuel );
|
||||||
|
emmanuel.getStores().add( fnac );
|
||||||
|
fnac.setImplantedIn( new HashSet<City>() );
|
||||||
|
City paris = new City();
|
||||||
|
fnac.getImplantedIn().add( paris );
|
||||||
|
paris.setName( "Paris" );
|
||||||
|
s.persist( fnac );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Store store;
|
||||||
|
KnownClient knownClient;
|
||||||
|
City city;
|
||||||
|
store = (Store) s.get( Store.class, fnac.getId() );
|
||||||
|
assertNotNull( store );
|
||||||
|
assertNotNull( store.getCustomers() );
|
||||||
|
assertEquals( 1, store.getCustomers().size() );
|
||||||
|
knownClient = store.getCustomers().iterator().next();
|
||||||
|
assertEquals( emmanuel.getName(), knownClient.getName() );
|
||||||
|
assertNotNull( store.getImplantedIn() );
|
||||||
|
assertEquals( 1, store.getImplantedIn().size() );
|
||||||
|
city = store.getImplantedIn().iterator().next();
|
||||||
|
assertEquals( paris.getName(), city.getName() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
knownClient = (KnownClient) s.get( KnownClient.class, emmanuel.getId() );
|
||||||
|
assertNotNull( knownClient );
|
||||||
|
assertNotNull( knownClient.getStores() );
|
||||||
|
assertEquals( 1, knownClient.getStores().size() );
|
||||||
|
store = knownClient.getStores().iterator().next();
|
||||||
|
assertEquals( fnac.getName(), store.getName() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCanUseCriteriaQuery() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Store fnac = new Store();
|
||||||
|
fnac.setName( "Fnac" );
|
||||||
|
Supplier emi = new Supplier();
|
||||||
|
emi.setName( "Emmanuel" );
|
||||||
|
emi.setSuppStores( new HashSet<Store>() );
|
||||||
|
fnac.setSuppliers( new HashSet<Supplier>() );
|
||||||
|
fnac.getSuppliers().add( emi );
|
||||||
|
emi.getSuppStores().add( fnac );
|
||||||
|
s.persist( fnac );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
List result = s.createCriteria( Supplier.class ).createAlias( "suppStores", "s" ).add(
|
||||||
|
Restrictions.eq( "s.name", "Fnac" ) ).list();
|
||||||
|
assertEquals( 1, result.size() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMappedBy() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Store fnac = new Store();
|
||||||
|
fnac.setName( "Fnac" );
|
||||||
|
Supplier emi = new Supplier();
|
||||||
|
emi.setName( "Emmanuel" );
|
||||||
|
emi.setSuppStores( new HashSet<Store>() );
|
||||||
|
fnac.setSuppliers( new HashSet<Supplier>() );
|
||||||
|
fnac.getSuppliers().add( emi );
|
||||||
|
emi.getSuppStores().add( fnac );
|
||||||
|
s.persist( fnac );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Store store;
|
||||||
|
Supplier supplier;
|
||||||
|
store = (Store) s.get( Store.class, fnac.getId() );
|
||||||
|
assertNotNull( store );
|
||||||
|
assertNotNull( store.getSuppliers() );
|
||||||
|
assertEquals( 1, store.getSuppliers().size() );
|
||||||
|
supplier = store.getSuppliers().iterator().next();
|
||||||
|
assertEquals( emi.getName(), supplier.getName() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
supplier = (Supplier) s.get( Supplier.class, emi.getId() );
|
||||||
|
assertNotNull( supplier );
|
||||||
|
assertNotNull( supplier.getSuppStores() );
|
||||||
|
assertEquals( 1, supplier.getSuppStores().size() );
|
||||||
|
store = supplier.getSuppStores().iterator().next();
|
||||||
|
assertEquals( fnac.getName(), store.getName() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Store.class,
|
||||||
|
KnownClient.class,
|
||||||
|
Supplier.class,
|
||||||
|
City.class,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,27 @@
|
||||||
//$Id$
|
/*
|
||||||
package org.hibernate.test.annotations.manytomany;
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.simple;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.persistence.CascadeType;
|
import javax.persistence.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.simple;
|
||||||
|
import java.util.Set;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
public class Supplier {
|
||||||
|
private Integer id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<Store> suppStores;
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToMany(mappedBy = "suppliers")
|
||||||
|
public Set<Store> getSuppStores() {
|
||||||
|
return suppStores;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuppStores(Set<Store> suppStores) {
|
||||||
|
this.suppStores = suppStores;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.targetentity;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Collection;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.Cascade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Employee in an Employer-Employee relationship
|
||||||
|
*
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@SuppressWarnings("serial")
|
||||||
|
public class Employee implements Serializable {
|
||||||
|
private Integer id;
|
||||||
|
private Collection<Employer> employers;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Column(name="fld_name")
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer integer) {
|
||||||
|
id = integer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ManyToMany(
|
||||||
|
cascade = {CascadeType.PERSIST, CascadeType.MERGE},
|
||||||
|
mappedBy = "employees"
|
||||||
|
)
|
||||||
|
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
|
||||||
|
org.hibernate.annotations.CascadeType.PERSIST})
|
||||||
|
public Collection<Employer> getEmployers() {
|
||||||
|
return employers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployers(Collection<Employer> employers) {
|
||||||
|
this.employers = employers;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.targetentity;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Collection;
|
||||||
|
import javax.persistence.CascadeType;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.JoinColumn;
|
||||||
|
import javax.persistence.JoinTable;
|
||||||
|
import javax.persistence.ManyToMany;
|
||||||
|
import javax.persistence.OrderBy;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
import org.hibernate.annotations.Cascade;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Employer in a employer-Employee relationship
|
||||||
|
*
|
||||||
|
* @author Emmanuel Bernard
|
||||||
|
*/
|
||||||
|
@Entity()
|
||||||
|
@Table(name="`Employer`")
|
||||||
|
@SuppressWarnings({"serial", "unchecked"})
|
||||||
|
public class Employer implements Serializable {
|
||||||
|
private Integer id;
|
||||||
|
private Collection employees;
|
||||||
|
|
||||||
|
@ManyToMany(
|
||||||
|
targetEntity = org.hibernate.test.annotations.manytomany.targetentity.Employee.class,
|
||||||
|
cascade = {CascadeType.PERSIST, CascadeType.MERGE}
|
||||||
|
)
|
||||||
|
@JoinTable(
|
||||||
|
name = "EMPLOYER_EMPLOYEE",
|
||||||
|
joinColumns = {@JoinColumn(name = "EMPER_ID")},
|
||||||
|
inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
|
||||||
|
)
|
||||||
|
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
|
||||||
|
@OrderBy("name asc")
|
||||||
|
public Collection getEmployees() {
|
||||||
|
return employees;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployees(Collection set) {
|
||||||
|
employees = set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer integer) {
|
||||||
|
id = integer;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, Red Hat Inc. or third-party contributors as
|
||||||
|
* indicated by the @author tags or express copyright attribution
|
||||||
|
* statements applied by the authors. All third-party contributions are
|
||||||
|
* distributed under license by Red Hat Inc.
|
||||||
|
*
|
||||||
|
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||||
|
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||||
|
* Lesser General Public License, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this distribution; if not, write to:
|
||||||
|
* Free Software Foundation, Inc.
|
||||||
|
* 51 Franklin Street, Fifth Floor
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.hibernate.test.annotations.manytomany.targetentity;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import org.hibernate.Hibernate;
|
||||||
|
import org.hibernate.Session;
|
||||||
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.testing.FailureExpectedWithNewMetamodel;
|
||||||
|
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gail Badner (extracted from ManyToManyTest authored by Emmanuel Bernard)
|
||||||
|
*/
|
||||||
|
@FailureExpectedWithNewMetamodel
|
||||||
|
public class ManyToManyTargetEntityTest extends BaseCoreFunctionalTestCase {
|
||||||
|
@Test
|
||||||
|
public void testBasic() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Employer er = new Employer();
|
||||||
|
Employee ee = new Employee();
|
||||||
|
s.persist( ee );
|
||||||
|
Set erColl = new HashSet();
|
||||||
|
Collection eeColl = new ArrayList();
|
||||||
|
erColl.add( ee );
|
||||||
|
eeColl.add( er );
|
||||||
|
er.setEmployees( erColl );
|
||||||
|
ee.setEmployers( eeColl );
|
||||||
|
//s.persist(ee);
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
er = (Employer) s.load( Employer.class, er.getId() );
|
||||||
|
assertNotNull( er );
|
||||||
|
assertNotNull( er.getEmployees() );
|
||||||
|
assertEquals( 1, er.getEmployees().size() );
|
||||||
|
Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
|
||||||
|
assertEquals( ee.getId(), eeFromDb.getId() );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ee = (Employee) s.get( Employee.class, ee.getId() );
|
||||||
|
assertNotNull( ee );
|
||||||
|
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
||||||
|
tx.commit();
|
||||||
|
assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
|
||||||
|
s.close();
|
||||||
|
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
ee = (Employee) s.get( Employee.class, ee.getId() );
|
||||||
|
assertNotNull( ee );
|
||||||
|
er = ee.getEmployers().iterator().next();
|
||||||
|
assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
|
||||||
|
s.delete( er );
|
||||||
|
s.delete( ee );
|
||||||
|
tx.commit();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOrderByEmployee() throws Exception {
|
||||||
|
Session s;
|
||||||
|
Transaction tx;
|
||||||
|
s = openSession();
|
||||||
|
tx = s.beginTransaction();
|
||||||
|
Employer employer = new Employer();
|
||||||
|
Employee employee1 = new Employee();
|
||||||
|
employee1.setName( "Emmanuel" );
|
||||||
|
Employee employee2 = new Employee();
|
||||||
|
employee2.setName( "Alice" );
|
||||||
|
s.persist( employee1 );
|
||||||
|
s.persist( employee2 );
|
||||||
|
Set erColl = new HashSet();
|
||||||
|
Collection eeColl = new ArrayList();
|
||||||
|
Collection eeColl2 = new ArrayList();
|
||||||
|
erColl.add( employee1 );
|
||||||
|
erColl.add( employee2 );
|
||||||
|
eeColl.add( employer );
|
||||||
|
eeColl2.add( employer );
|
||||||
|
employer.setEmployees( erColl );
|
||||||
|
employee1.setEmployers( eeColl );
|
||||||
|
employee2.setEmployers( eeColl2 );
|
||||||
|
|
||||||
|
s.flush();
|
||||||
|
s.clear();
|
||||||
|
|
||||||
|
employer = (Employer) s.get( Employer.class, employer.getId() );
|
||||||
|
assertNotNull( employer );
|
||||||
|
assertNotNull( employer.getEmployees() );
|
||||||
|
assertEquals( 2, employer.getEmployees().size() );
|
||||||
|
Employee eeFromDb = (Employee) employer.getEmployees().iterator().next();
|
||||||
|
assertEquals( employee2.getName(), eeFromDb.getName() );
|
||||||
|
tx.rollback();
|
||||||
|
s.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class[] getAnnotatedClasses() {
|
||||||
|
return new Class[]{
|
||||||
|
Employee.class,
|
||||||
|
Employer.class
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue