[jboss-user] [JBoss Seam] - CRUD framework and subclasses

ector7280 do-not-reply at jboss.com
Fri May 25 16:54:30 EDT 2007


I used seam-gen to generate my entities from my db schema.
I have one entity, Foo that has a subclass SubFoo.
The problem I'm having is that I never directly use Foo, it's always a subclass so, I'm trying to figure out how to wire the super class Foo to a Collection of data that does not have a direct relationship with the subclass.

Here's the code that will illustrate what I'm talking about:


  | 
  | @Entity
  | @Name("foo")
  | @Table(name = "FOO")
  | @Inheritance(strategy=InheritanceType.JOINED)
  | public class Foo implements java.io.Serializable
  | {
  | 
  | 	private int projectNumber;
  | 
  | 	protected Program program;
  |        
  |         protected List<Commitment> commitments = new ArrayList<Commitment>();
  |     
  |      ......
  | 
  |      @Id
  | 	
  | 	@Column(name = "PROJECT_NUMBER", unique = true, nullable = false, precision = 6, scale = 0)
  | 	@NotNull
  | 	public int getProjectNumber()
  | 	{
  | 		return this.projectNumber;
  | 	}
  | 
  | 	public void setProjectNumber(int projectNumber)
  | 	{
  | 		this.projectNumber = projectNumber;
  | 	}
  | 
  | @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "foo")
  | 	public List<Commitment> getCommitments()
  | 	{
  | 		return this.commitments;
  | 	}
  | 
  | 	public void setCommitments(List<Commitment> commitments)
  | 	{
  | 		this.commitments = commitments;
  | 	}
  | 
  | }
  | 
  | 


  | @Entity
  | @Table(name = "SUB_FOO")
  | @PrimaryKeyJoinColumn(name="PROJECT_NUMBER")
  | public class SubFoo extends Foo implements java.io.Serializable {
  | 
  | 	private int projectNumber;
  |         
  | 
  |         @Column(name = "PROJECT_NUMBER", insertable=false, updatable=false)
  | 	@NotNull
  | 	public int getProjectNumber() {
  | 		return this.projectNumber;
  | 	}
  | 
  | 	public void setProjectNumber(int projectNumber) {
  | 		this.projectNumber = projectNumber;
  | 	}
  |      
  |         .....
  | }


The relationship in CommitmentHome is tied to the super class, Foo.


  | 
  | package gov.dot.marad.persistence.ejb.model;
  | 
  | import javax.persistence.EntityManager;
  | 
  | import org.jboss.seam.annotations.Factory;
  | import org.jboss.seam.annotations.In;
  | import org.jboss.seam.annotations.Name;
  | import org.jboss.seam.framework.EntityHome;
  | 
  | @Name("commitmentHome")
  | public class CommitmentHome extends EntityHome<Commitment> {
  | 
  | 	@In(create = true)
  | 	FooHome fooHome;
  | 	
  | 	@In(create = true)
  | 	EntityManager entityManager;
  | 	
  | 	@In(value="#{fooProjectNumber}")
  | 	private String fooProjectNumber;
  | 
  | 	public EntityManager getEntityManager()
  | 	{
  | 		return entityManager;
  | 	}
  | 
  | 	@Factory("commitment")
  | 	public Commitment initCommitment()
  | 	{
  | 		return getInstance();
  | 	}
  | 
  | 	public void setCommitmentCommitmentId(Integer id) {
  | 		setId(id);
  | 	}
  | 
  | 	public Integer getCommitmentCommitmentId() {
  | 		return (Integer) getId();
  | 	}
  | 
  | 	@Override
  | 	protected Commitment createInstance() {
  | 		Commitment commitment = new Commitment();
  | 		commitment.setFoo(getEntityManager().find(Foo.class, new Integer(fooProjectNumber)));
  | 		return commitment;
  | 	}
  | 
  | 	public void wire() {
  | 		Foo foo = fooHome.getDefinedInstance();
  | 		if (foo != null) {
  | 			getInstance().setFoo(foo);
  | 		}
  | 	}
  | 
  | 	public boolean isWired() {
  | 		return true;
  | 	}
  | 
  | 	public Commitment getDefinedInstance() {
  | 		return isIdDefined() ? getInstance() : null;
  | 	}
  | 
  | 	/**
  | 	 * @return the projectNumber
  | 	 */
  | 	public String getFooProjectNumber()
  | 	{
  | 		return fooProjectNumber;
  | 	}
  | 
  | 	/**
  | 	 * @param projectNumber the projectNumber to set
  | 	 */
  | 	public void setFooProjectNumber(String projectNumber)
  | 	{
  | 		this.fooProjectNumber = projectNumber;
  | 	}
  | 
  | }
  | 

Commitment.java

  | 
  |              .....
  |  
  | @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
  | 	@JoinColumn(name = "PROJECT_NUMBER")
  | 	public Foo getFoo() {
  | 		return this.foo;
  | 	}
  | 
  |             .....
  | 
  | 

Is there a way to do this with EntityHome's or should I go back to Session beans?



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

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



More information about the jboss-user mailing list