Christoph Adl wrote:

>Hello!
>
>I'm using XDoclet2 for about a month and think that it is a great part of 
>software, and a nice job you have done. 
>
>BUT - I had a problem today. I'm using XDoclet2 to generate Hibernate-Mapping 
>files. In a special case this does not work properly. 
>
>First, I'm using Java 1.5 Typesafe Enums. Correct syntax with enums seem to 
>crash the XDoclet parser:
>
>public enum TestEnum {
>  Value1, Value2;  
>}
>E:\build.xml:28: com.thoughtworks.qdox.parser.ParseException: syntax error 
>@[x,y] in file:/E:/DerivedClass.java
>
>The parser does not like the semi-colon after "Value2", which is correct 
>syntax according to the "Planet" example in 
>http://java.sun.com/j2se/1.5.0/docs/guide/language/enums.html and the javac 
>likes it as well. But that is not the big problem. Just to let u know. I just 
>remove the semi-colon for now (which is correct syntax as well).
>
>The main problem is that if I use the @hibernate.typdef tag in a 
>@hibernate.joined-subclass tag it does not lead to any XML output in the 
>generated mapping file. Example:
>
>==== BaseClass.java ====
>package at.arcsmed.kio.beans;
>
>/**
> * @hibernate.class
> *   table = "Base_Class"
> */
>public class BaseClass {
>    /**
>     * @hibernate.id
>     *   generator-class = "native"
>     */
>    private int id;
>
>    /**
>     * @return Returns the id.
>     */
>    public int getId() {
>        return id;
>    }
>
>    /**
>     * @param id The id to set.
>     */
>    public void setId(int id) {
>        this.id = id;
>    }   
>}
>==== DerivedClass.java ====
>package at.arcsmed.kio.beans;
>// i've used the GenericEnumUserType from http://hibernate.org/272.html
>/**
> * @hibernate.joined-subclass
> *   table = "DerivedClass"
> *   
>* @hibernate.typedef
> *   name = "TestEnumType"
> *   class = "at.arcsmed.kio.beans.enums.GenericEnumUserType"
> * @hibernate.typedef-param
> *   typedef-name = "TestEnumType"
> *   name = "enumClass" 
> *   value = "at.arcsmed.kio.beans.DerivedClass$TestEnum" 
> */
>public class DerivedClass extends BaseClass {
>    public enum TestEnum {
>        Value1, Value2
>    }
>
>    /**
>     * @hibernate.property
>     *   type = "TestEnumType"
>     */
>    private TestEnum test;
>
>    /**
>     * @return Returns the test.
>     */
>    public TestEnum getTest() {
>        return test;
>    }
>
>    /**
>     * @param test The test to set.
>     */
>    public void setTest(TestEnum test) {
>        this.test = test;
>    }
>}
>==== BaseClass.hbm.xml (generated via xdoclet2) ====
><?xml version="1.0" encoding="ISO-8859-1"?>
><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 
>3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";>
>
><hibernate-mapping>
>  <class table="Base_Class" name="at.arcsmed.kio.beans.BaseClass">
>    <id name="id">
>      <generator class="native"/>
>    </id>
>    <joined-subclass name="at.arcsmed.kio.beans.DerivedClass" 
> table="DerivedClass">
>      <key/>
>      <property name="test" type="TestEnumType"/>
>    </joined-subclass>
>  </class>
></hibernate-mapping>
>
>=============
>There is no sign of my typedef :-(. While creating the example i realised, 
>that there is a problem with the ANT integration as well. If i make changes to 
>the DerivedClass.java-File, the BaseClass.hbm.xml file is not re-generated! 
>This problem is probably a result of the fact, that the DerivedClass-Mapping 
>must be included in the mapping file of BaseClass (a speciality of the 
>Hibernate DTD). The solution is, to create the typedef-element in 
>BaseClass.hbm.xml outside the class element (this must happen for the whole 
>inheritance tree - so for joined-subclass elements in joined-subclass elements 
>as well). So here is the proper BaseClass.hbm.xml file:
>
><?xml version="1.0" encoding="ISO-8859-1"?>
><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 
>3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd";>
>
><hibernate-mapping>
>  <typedef class="at.arcsmed.kio.beans.enums.GenericEnumUserType" 
> name="TestEnumType">
>    <param name="enumClass">at.arcsmed.kio.beans.DerivedClass$TestEnum</param>
>  </typedef>
>  <class table="Base_Class" name="at.arcsmed.kio.beans.BaseClass">
>    <id name="id">
>      <generator class="native"/>
>    </id>
>    <joined-subclass name="at.arcsmed.kio.beans.DerivedClass" 
> table="DerivedClass">
>      <key/>
>      <property name="test" type="TestEnumType"/>
>    </joined-subclass>
>  </class>
></hibernate-mapping>
>
>As a result of the missing typedef I get an error during the creation of the 
>database schema with hibernate: 
>Exception in thread "main" org.hibernate.MappingException: Could not determine 
>type for: TestEnumType, for columns: [org.hibernate.mapping.Column(test)]
>     [java] at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:265)
>     [java] at org.hibernate.mapping.Column.getSqlTypeCode(Column.java:128)
>     [java] at org.hibernate.mapping.Column.getSqlType(Column.java:172)
>     [java] at org.hibernate.mapping.Table.sqlCreateString(Table.java:263)
>     [java] at 
> org.hibernate.cfg.Configuration.generateSchemaCreationScript(Configuration.java:669)
>     [java] at 
> org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:65)
>     [java] at 
> org.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:49)
>     [java] at 
> at.arcsmed.kio.test.HibernateSchema.createSchema(HibernateSchema.java:29)
>     [java] at 
> at.arcsmed.kio.test.HibernateSchema.main(HibernateSchema.java:24)
>
>I hope this issues can be addressed somehow,
>
>regards
>Christoph
>
>===========================================
>
>  DI Christoph ADL
>  ARC Seibersdorf research GmbH
>  Biomedical Engineering / eHealth systems
>
>  Viktor-Kaplan-Straße 2/1
>  A-2700 Wiener Neustadt, Austria
>
>  T: +43 (0)2622 69290-41
>  F: +43 (0)2622 69290-24
>  E: [EMAIL PROTECTED]
>  H: www.arcsmed.at
>
>
>  
>
If you are using java 1.5 you may use hibernate annotations. With
annotations you will get more strict code:

@Entity(access=AccessType.FIELD)
@Table(name="Base_Class")
public class BaseClass {

    @Id(generate=GeneratorType.NATIVE)
    private int id;

    ...
}


Serge Bogatyrjov.

Reply via email to