Hi all,
I'm moving project to Hibernate Annotations. We have an abstract class - Lead. It has few subclasses newLead, usedLead etc. (see the code below)
Question:
When I try to get an object from DB Code:
session.load(Lead.class, leadId);
the "org.hibernate.MappingException: Unknown entity: com.model.Lead" is thrown. It works with Code:
session.load(NewLead.class, leadId);
,
but is it possible to get an object from DB by superclass type? They all stored in the same table and have unique ids anyway. What I did wrong? It worked with classic Hibernate.
Any help will help :)
Thanks in advance.Hibernate version: Hibernate 3.2.0CR2
Hibernate Annotations 3.2.0CR1
Mapping documents:Hibernate Annotations mapping<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<mapping class="au.com.carsales.sys.lead.model.UsedLead"/>
<mapping class="au.com.carsales.sys.lead.model.NewLead"/>
</session-factory>
</hibernate-configuration>
Classic hibernate mapping used before:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "com.model.Lead" table = "LEADS" lazy = "true">
<id name="leadId"
column="MASTER_LEAD_ID"
type = "long"
unsaved-value="0">
<generator class="sequence">
<param name="sequence">
master_lead_id_seq
</param>
</generator>
</id>
<discriminator column="LEAD_TYPE_ID" type="string" />
<component name="leadStatus"
class="au.com.carsales.sys.lead.model.LeadStatus">
<property name="statusId"
column="LEAD_STATUS_ID"
type="long" />
<property name="statusDesc"
column="LEAD_STATUS_DESCRIPTION"
type="string" />
</component>
....
<subclass name="com.model.NewLead"
discriminator-value="1">
</subclass>
<subclass name="com.model.UsedLead"
discriminator-value="2">
</subclass>
</class>
</hibernate-mapping>
CodeCode:
@MappedSuperclass
@Table(name = "LEADS")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "LEAD_TYPE_ID", discriminatorType = DiscriminatorType.STRING)
@org.hibernate.annotations.Entity(optimisticLock = OptimisticLockType.VERSION)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public abstract class Lead implements Serializable {
private long leadId;
private LeadStatus leadStatus;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
@SequenceGenerator(name = "SEQ_GEN", sequenceName = "master_lead_id_seq", allocationSize = 1)
@Column(name = "MASTER_LEAD_ID")
public long getLeadId() {
return leadId;
}
public void setLeadId(long leadId) {
this.leadId = leadId;
}
@Embedded
@AttributeOverrides( {
@AttributeOverride(name = "statusId", column = @Column(name = "LEAD_STATUS_ID")),
@AttributeOverride(name = "statusDesc", column = @Column(name = "LEAD_STATUS_DESCRIPTION")) })
public LeadStatus getLeadStatus() {
return leadStatus;
}
public void setLeadStatus(LeadStatus leadStatus) {
this.leadStatus = leadStatus;
}
.....
}
@Entity
@Table(name = "LEADS")
@DiscriminatorValue("2")
public class UsedLead extends Lead implements Serializable {
private static final long serialVersionUID = -3344961002006417591L;
}
@Entity
@Table(name = "LEADS")
@DiscriminatorValue("1")
public class NewLead extends Lead implements Serializable {
private static final long serialVersionUID = -4344961002306417591L;
}
@Embeddable
public class LeadStatus implements Serializable {
private static final long serialVersionUID = 606276831663986341L;
private long statusId;
private String statusDesc;
public String getStatusDesc() {
return statusDesc;
}
public void setStatusDesc(String statusDesc) {
this.statusDesc = statusDesc;
}
public long getStatusId() {
return statusId;
}
public void setStatusId(long statusId) {
this.statusId = statusId;
}
public int hashCode() {
return this.statusDesc.hashCode();
}
public boolean equals(Object o) {
if (o instanceof LeadStatus)
return ((LeadStatus) o).getStatusDesc()
.equals(this.getStatusDesc());
return false;
}
}