Is Disciminator used in @OneToMany?
edvedafi Aug 2, 2006 3:47 PMI have a Entity (A) that has a List of Bservices and one Baccount record. Bservice and Baccount both inherit from an abstract class B and are both stored in table B. The code below is how I thought it should work, but it does not. When I try to deploy it says there is a "broken column mapping a.id of B". If I change A to have a OneToMany relationship with Baccount it will deploy but then I get this exception in the client when I call a.getBs().
javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.WrongClassException: Object with id: ... was not of the specified subclass: bAccount
In an attempt to figure out what is going on I commented out all the relationship information for Baccount so that A had a set of Bservices, but knew nothing of Baccounts. In this case I got all the B records (both BService and Baccount) when I called a.getBs(). Does a Join ignore the DiscriminatorValues? Shouldn't the inheratence take care of not populating Bservice with records that have a different discriminator value? If so is there any way around this to only load Bservices into bs and Baccounts into bAccount, without writing a query for each and having to execute both queries to load the objects?
@Entity
@DiscriminatorValue(value="C")
public class Bservice extends B implements java.io.Serializable {
private A a;
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumns( { @JoinColumn(name="LOC", insertable=false, updatable=false),
@JoinColumn(name="CUST_NO", insertable=false, updatable=false),
@JoinColumn(name="CYC_YEAR", insertable=false, updatable=false),
@JoinColumn(name="CYC", insertable=false, updatable=false),
@JoinColumn(name="CYC_END_DAY", insertable=false, updatable=false) } )
public A getA() {
return a;
}
public void setA(Aa) {
this.a= a;
}
@Entity
@DiscriminatorValue(value="A")
public class Baccount extends B implements java.io.Serializable {
private A a;
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumns( { @JoinColumn(name="LOC", insertable=false, updatable=false),
@JoinColumn(name="CUST_NO", insertable=false, updatable=false),
@JoinColumn(name="CYC_YEAR", insertable=false, updatable=false),
@JoinColumn(name="CYC", insertable=false, updatable=false),
@JoinColumn(name="CYC_END_DAY", insertable=false, updatable=false) } )
public Isumcust getIsumcust() {
return isumcust;
}
public void setA(A a) {
this.a= a;
}
}
@Entity
@Table(name="A")
public class A implements java.io.Serializable {
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumns( { @JoinColumn(name="LOC", insertable=false, updatable=false),
@JoinColumn(name="CUST_NO", insertable=false, updatable=false),
@JoinColumn(name="CYC_YEAR", insertable=false, updatable=false),
@JoinColumn(name="CYC", insertable=false, updatable=false),
@JoinColumn(name="CYC_END_DAY", insertable=false, updatable=false) } )
public Set<Bservice> getBs()
{
return this.bs;
}
public void setIsummains( Set<Bservice> bs)
{
this.bs= bs;
}
@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumns( { @JoinColumn(name="CUST_NO", referencedColumnName="CUST_NO", insertable=false, updatable=false),
@JoinColumn(name="CYC_END_DAY", referencedColumnName="CYC_END_DAY", insertable=false, updatable=false),
@JoinColumn(name="CYC", referencedColumnName="CYC", insertable=false, updatable=false),
@JoinColumn(name="CYC_YEAR", referencedColumnName="CYC_YEAR", insertable=false, updatable=false),
@JoinColumn(name="LOC", referencedColumnName="LOC", insertable=false, updatable=false) } )
public Baccount getBaccount() {
return this.bAccount;
}
public void setIsummainAccount(Baccount bAccount) {
this.bAccount = bAccount;
}
}