Dobry den,
hraju si s Hibernate (+Spring) a narazil jsem na nasledujici chovani.
Mam tridu Visit, velmi primocare hb mapovani. Kdyz ji ukladam
prostrednictvim Hibernate do DB vsechno funguje skvele.
Pak mam potomka tehle tridy: tridu MockVisit (trida nedela nic
specialniho, jen poskytuje instance pouzite v Junit testech)
Kdyz instanci MockVisit predhodim Hibernate k ulozedni do DB, dostanu chybu:
org.hibernate.MappingException: Unknown entity: ...model._mock.MockVisit
Zda se mi, jako by Hibernate nedokazala zjistit, ze MockVisit je
potomkem Visit. Tohle je normalni chovani Hibernate nebo nekde delam chybu?
Spring 1.2.8, Hibernate 3
Diky
kolisko
Prikladam zdrojaky obou trid a mapovani. Vypustil jsem, podle meho
soudu, nudne casti:
public class Visit extends DBEntity{
private static final long serialVersionUID =
-4158611581435953020L;
private User enteredBy = null; // entered by user
private User confirmedBy = null;
}
--------------------------------------------------------
abstract public class DBEntity implements Serializable{
private Integer id;
// ... getter a setter pro id
public boolean isNew() {
return (this.id == null);
}
}
--------------------------------------------------------------
public class MockVisit extends Visit {
private static final long serialVersionUID = 6365990982317321939L;
public static final Visit V1 = new MockVisit (MockUser.U1, MockUser.U1);
// trivialni private konstruktor
----------------------------------------------------------------
jak ukladam do DB (vyuzivam hibernate podporu ve Springu):
getHibernateTemplate().merge(visit);
Visit.hbm.xml
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping auto-import="true" default-lazy="false">
<class name="cz.euromise.adamekJ.model.Visit" table="Navsteva"
schema="ML2">
<id name="id" column="NavstevaId"> <generator class="native"/> </id>
<many-to-one name="enteredBy"
class="cz.euromise.adamekJ.model.User"
column="ZaznamenalId"
fetch="select"/>
<many-to-one name="confirmedBy"
class="cz.euromise.adamekJ.model.User"
column="PotvrdilId"
fetch="select"/>
</class>
</hibernate-mapping>
---------------------------------------------------------------------
Spring/Hibernate konfigurace
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="mappingResources">
<list>
<value>hbm/Patient.hbm.xml</value>
<value>hbm/Visit.hbm.xml</value>
<value>hbm/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!-- HSQL mapping --> <prop
key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop
key="hibernate.cglib.use_reflection_optimizer">false</prop>
</props>
</property>
...
</bean>