CRUD framework and subclasses
ector7280 May 25, 2007 4:54 PMI 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?