[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