[jboss-user] [EJB 3.0] - Re: ManyToOne and Composite Keys

jimk1723 do-not-reply at jboss.com
Mon Apr 16 17:07:22 EDT 2007


I think I answered my own question - I was hung up on the seam-gen'ed code; I implemented my own entities which seem to work fine.

I removed the mappedBy attribute on the @OneToMany annotation and added a @JoinColumn annotation - that seemed to fix things.

package com.mydomain.example;
  | 
  | import java.util.HashSet;
  | import java.util.Set;
  | 
  | import javax.persistence.CascadeType;
  | import javax.persistence.Column;
  | import javax.persistence.Entity;
  | import javax.persistence.FetchType;
  | import javax.persistence.GeneratedValue;
  | import javax.persistence.Id;
  | import javax.persistence.JoinColumn;
  | import javax.persistence.OneToMany;
  | import javax.persistence.Table;
  | 
  | import org.hibernate.validator.NotNull;
  | 
  | /**
  |  * Department generated by hbm2java
  |  */
  | @Entity
  | @Table(name = "DEPARTMENT")
  | public class Department implements java.io.Serializable {
  | 
  | 	private long departmentId;
  | 
  | 	private Set<DepartmentStrings> strings = new HashSet<DepartmentStrings>(0);
  | 
  | 	public Department() {
  | 	}
  | 
  | 	public Department(long departmentId) {
  | 		this.departmentId = departmentId;
  | 	}
  | 
  | 	public Department(long departmentId,
  | 			Set<DepartmentStrings> departmentStringses) {
  | 		this.departmentId = departmentId;
  | 
  | 		this.strings = departmentStringses;
  | 	}
  | 
  | 	@Id
  | 	@Column(name = "DEPARTMENT_ID", unique = true, nullable = false, precision = 16, scale = 0)
  | 	@NotNull
  | 	@GeneratedValue
  | 	public long getDepartmentId() {
  | 		return this.departmentId;
  | 	}
  | 
  | 	public void setDepartmentId(long departmentId) {
  | 		this.departmentId = departmentId;
  | 	}
  | 
  | 	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  | 	@JoinColumn(name = "DEPARTMENT_ID")
  | 	public Set<DepartmentStrings> getStrings() {
  | 		return this.strings;
  | 	}
  | 
  | 	public void setStrings(Set<DepartmentStrings> strings) {
  | 		this.strings = strings;
  | 	}
  | 
  | }
  | 


package com.mydomain.example;
  | 
  | import javax.persistence.AttributeOverride;
  | import javax.persistence.AttributeOverrides;
  | import javax.persistence.Column;
  | import javax.persistence.EmbeddedId;
  | import javax.persistence.Entity;
  | import javax.persistence.Table;
  | 
  | import org.hibernate.validator.NotNull;
  | 
  | /**
  |  * DepartmentStrings generated by hbm2java
  |  */
  | @Entity
  | @Table(name = "DEPARTMENT_STRINGS")
  | public class DepartmentStrings implements java.io.Serializable {
  | 
  | 	private DepartmentStringsId id;
  | 
  | 	private String name;
  | 
  | 	public DepartmentStrings() {
  | 	}
  | 
  | 	public DepartmentStrings(DepartmentStringsId id) {
  | 		this.id = id;
  | 	}
  | 
  | 	@Column(name = "NAME")
  | 	public String getName() {
  | 		return name;
  | 	}
  | 
  | 	public void setName(String name) {
  | 		this.name = name;
  | 	}
  | 
  | 	@EmbeddedId
  | 	@AttributeOverrides( {
  | 			@AttributeOverride(name = "department", column = @Column(name = "DEPARTMENT_ID", precision = 16, scale = 0)),
  | 			@AttributeOverride(name = "langCode", column = @Column(name = "LANG_CODE", nullable = false, length = 5)) })
  | 	@NotNull
  | 	public DepartmentStringsId getId() {
  | 		return this.id;
  | 	}
  | 
  | 	public void setId(DepartmentStringsId id) {
  | 		this.id = id;
  | 	}
  | }
  | 


package com.mydomain.example;
  | 
  | import java.io.Serializable;
  | 
  | import javax.persistence.Column;
  | import javax.persistence.JoinColumn;
  | import javax.persistence.ManyToOne;
  | 
  | public class DepartmentStringsId implements Serializable {
  | 
  | 	private Department department;
  | 
  | 	private String langCode;
  | 
  | 	public DepartmentStringsId() {
  | 	}
  | 
  | 	public DepartmentStringsId(Department department, String langCode) {
  | 		super();
  | 		this.department = department;
  | 		this.langCode = langCode;
  | 	}
  | 
  | 	@ManyToOne
  | 	@JoinColumn(name = "DEPARTMENT_ID")
  | 	public Department getDepartment() {
  | 		return department;
  | 	}
  | 
  | 	public void setDepartment(Department department) {
  | 		this.department = department;
  | 	}
  | 
  | 	@Column(name = "LANG_CODE")
  | 	public String getLangCode() {
  | 		return langCode;
  | 	}
  | 
  | 	public void setLangCode(String langCode) {
  | 		this.langCode = langCode;
  | 	}
  | }
  | 

...and some quick TestNG methods:


  | 	@Test(enabled = true)
  | 	public void testCreateWithString() throws Exception {
  | 		EntityManagerFactory emf = Persistence
  | 				.createEntityManagerFactory("ejbexample");
  | 		EntityManager em = emf.createEntityManager();
  | 		em.getTransaction().begin();
  | 
  | 		Department d = new Department();
  | 
  | 		DepartmentStrings ds1 = new DepartmentStrings(new DepartmentStringsId(
  | 				d, "en-us"));
  | 		ds1.setName("Test name");
  | 
  | 		DepartmentStrings ds2 = new DepartmentStrings(new DepartmentStringsId(
  | 				d, "es-mx"));
  | 		ds2.setName("Pruebe el nombre");
  | 
  | 		d.getStrings().add(ds1);
  | 		d.getStrings().add(ds2);
  | 
  | 		em.persist(d);
  | 		em.getTransaction().commit();
  | 
  | 		this.departmentId = d.getDepartmentId();
  | 	}
  | 
  | 	@Test(enabled = true, dependsOnMethods = "testCreateWithString")
  | 	public void testLookup() throws Exception {
  | 		EntityManagerFactory emf = Persistence
  | 				.createEntityManagerFactory("ejbexample");
  | 		EntityManager em = emf.createEntityManager();
  | 		Department d = em.find(Department.class, this.departmentId);
  | 
  | 		assert d.getStrings().size() == 2;
  | 
  | 		for (DepartmentStrings ds : d.getStrings()) {
  | 			assert ds.getName().equals("Test name")
  | 					|| ds.getName().equals("Pruebe el nombre");
  | 		}
  | 	}
  | 

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4037738#4037738

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4037738



More information about the jboss-user mailing list