Author: smarlow(a)redhat.com
Date: 2010-01-13 14:35:54 -0500 (Wed, 13 Jan 2010)
New Revision: 18543
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ContactInfo.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/JobInfo.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/PhoneNumber.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ProgramManager.java
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
Log:
HHH-4685 Make sure bidirectional @*To* works from an embedded object to another entity
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ContactInfo.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ContactInfo.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ContactInfo.java 2010-01-13
19:35:54 UTC (rev 18543)
@@ -0,0 +1,24 @@
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToMany;
+import java.util.List;
+
+@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;
+ }
+
+}
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java 2010-01-13
18:04:02 UTC (rev 18542)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/Employee.java 2010-01-13
19:35:54 UTC (rev 18543)
@@ -4,6 +4,7 @@
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.CascadeType;
+import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@@ -26,7 +27,30 @@
private Integer id;
private Collection<Employer> employers;
private String name;
+ ContactInfo contactInfo;
+ JobInfo jobInfo;
+ // ContactInfo is for ManyToMany testing
+ @Embedded
+ public ContactInfo getContactInfo() {
+ return contactInfo;
+ }
+
+ public void setContactInfo(ContactInfo contactInfo) {
+ this.contactInfo = contactInfo;
+ }
+
+ // JobInfo is for OneToMany testing
+ @Embedded
+ public JobInfo getJobInfo() {
+ return jobInfo;
+ }
+
+ public void setJobInfo(JobInfo jobInfo) {
+ this.jobInfo = jobInfo;
+ }
+
+
@Column(name="fld_name")
public String getName() {
return name;
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/JobInfo.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/JobInfo.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/JobInfo.java 2010-01-13
19:35:54 UTC (rev 18543)
@@ -0,0 +1,29 @@
+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;
+ }
+
+}
Modified:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2010-01-13
18:04:02 UTC (rev 18542)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2010-01-13
19:35:54 UTC (rev 18543)
@@ -1,4 +1,5 @@
//$Id$
+//$Id$
package org.hibernate.test.annotations.manytomany;
@@ -7,6 +8,7 @@
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import org.hibernate.Hibernate;
@@ -641,6 +643,81 @@
s.close();
}
+ // Test for HHH-4685
+ // 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.
+ public void testManyToManyEmbeddableBiDirectionalDotNotationInMappedBy() throws
Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ 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.flush();
+ s.clear();
+ tx.commit();
+
+ tx.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());
+ tx.commit();
+
+ s.close();
+ }
+
+ // Test for HHH-4685
+ // 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.
+ public void testOneToManyEmbeddableBiDirectionalDotNotationInMappedBy() throws Exception
{
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ 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.flush();
+ s.clear();
+ tx.commit();
+
+ tx.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()
);
+ tx.commit();
+ s.close();
+ }
+
/**
* @see org.hibernate.test.annotations.TestCase#getMappings()
*/
@@ -664,7 +741,9 @@
Inspector.class,
InspectorPrefixes.class,
BuildingCompany.class,
- Building.class
+ Building.class,
+ PhoneNumber.class,
+ ProgramManager.class
};
}
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/PhoneNumber.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/PhoneNumber.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/PhoneNumber.java 2010-01-13
19:35:54 UTC (rev 18543)
@@ -0,0 +1,31 @@
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import java.util.Collection;
+
+@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;
+ }
+}
Added:
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ProgramManager.java
===================================================================
---
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ProgramManager.java
(rev 0)
+++
core/trunk/annotations/src/test/java/org/hibernate/test/annotations/manytomany/ProgramManager.java 2010-01-13
19:35:54 UTC (rev 18543)
@@ -0,0 +1,33 @@
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import java.util.Collection;
+
+@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;
+ }
+
+}
Show replies by date