[hibernate-issues] [Hibernate-JIRA] Commented: (HBX-849) Tools does not insert @Type in POJOs for user types defined in reveng.xml
Reiner Saddey (JIRA)
noreply at atlassian.com
Sat Jan 9 07:40:30 EST 2010
[ http://opensource.atlassian.com/projects/hibernate/browse/HBX-849?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=35164#action_35164 ]
Reiner Saddey commented on HBX-849:
-----------------------------------
Until this issue is fixed (which in my opinion could take a considerable amount of time due to its complex build - if it only were a Maven project), it can be worked around yielding identical results and without any changes to released code - just by using all the hidden marvels Hibernate Tools has to offer. Within this description, I'm assuming that the JBoss Hibernate Eclipse plugin be used.
# Create a utility Class (e.g. Ejb3CustomTypeAnnotation) that constructs a @Type annotation from a pojo and one of its properties.
# Within your Hibernate Code Generation Configuration, make this utility class available by selecting the Domain code exporter and adding a property named hibernatetool.Ejb3CustomTypeAnnotation.toolclass stating the full name of the utility class (e.g. com.carano.fw.hibernate.util.reverse.Ejb3CustomTypeAnnotation).
# Within your Eclipse-project, create a templates/pojo directory and supply an enhanced version of Ejb3PropertyGetAnnotation.ftl that calls Ejb3CustomTypeAnnotation.
# Within your Hibernate Code Generation Configuration, check Use custom templates und select the templates directory (not the templates/pojo).
Et voilà - your POJOS will have @Type for custom types :-)
Your utility class should look similar to:
{code:java}
package com.carano.fw.hibernate.util.reverse;
import org.hibernate.mapping.Property;
import org.hibernate.tool.hbm2x.pojo.POJOClass;
import org.hibernate.type.CustomType;
import org.hibernate.type.Type;
/**
* Define Property hibernatetool.Ejb3CustomTypeAnnotation.toolclass =
* com.carano.fw.hibernate.util.reverse.Ejb3CustomTypeAnnotation
*
* Use as ${Ejb3CustomTypeAnnotation}.generateAnnTypeAnnotation(pojo,property)
* within Ejb3PropertyGetAnnotation.ftl
*/
public class Ejb3CustomTypeAnnotation {
public String generateAnnTypeAnnotation(final POJOClass pojoClass, final Property property) {
final Type type = property.getType();
if (type instanceof CustomType) {
return " @" + pojoClass.importType("org.hibernate.annotations.Type") + "(type=\"" + type.getName() + "\")";
} else {
return "";
}
}
}
{code}
Your enhanced Ejb3PropertyGetAnnotation.ftl should look similar to:
{code}
<#if ejb3>
<#if pojo.hasIdentifierProperty()>
<#if property.equals(clazz.identifierProperty)>
${pojo.generateAnnIdGenerator()}
<#-- if this is the id property (getter)-->
<#-- explicitly set the column name for this property-->
</#if>
</#if>
<#if c2h.isOneToOne(property)>
${pojo.generateOneToOneAnnotation(property, cfg)}
<#elseif c2h.isManyToOne(property)>
${pojo.generateManyToOneAnnotation(property)}
<#--TODO support optional and targetEntity-->
${pojo.generateJoinColumnsAnnotation(property, cfg)}
<#elseif c2h.isCollection(property)>
${pojo.generateCollectionAnnotation(property, cfg)}
<#else>
${pojo.generateBasicAnnotation(property)}
${pojo.generateAnnColumnAnnotation(property)}
${Ejb3CustomTypeAnnotation.generateAnnTypeAnnotation(pojo,property)}
</#if>
</#if>
{code}
> Tools does not insert @Type in POJOs for user types defined in reveng.xml
> -------------------------------------------------------------------------
>
> Key: HBX-849
> URL: http://opensource.atlassian.com/projects/hibernate/browse/HBX-849
> Project: Hibernate Tools
> Issue Type: Patch
> Components: hbm2java, reverse-engineer
> Environment: jboss-seam-1.1.0.GA, MySQL
> Reporter: Zeljko Trogrlic
> Assignee: Anthony Patricio
> Attachments: BasicPOJOClass.java, BasicPOJOClass.java, Ejb3PropertyGetAnnotation.ftl, HBX-849.patch, POJOClass.java
>
>
> I have created reveng.xml file:
> <hibernate-reverse-engineering>
> <table
> catalog="configuration"
> name="userdb_domain_acl">
> <column name="enabled" type="com.siemens.msm.model.mapping.BooleanEnumType" exclude="false"/>
> </table>
> </hibernate-reverse-engineering>
> and included it in build.xml:
> <jdbcconfiguration propertyfile="build.properties"
> packagename="${model.package}"
> revengfile="${project.home}/reveng.xml"/>
> Generated POJO attribute has proper type, but user type information is missing:
> @Column(name = "enabled")
> @Length(max = 42)
> public Boolean getEnabled() {
> ....
> so Hibernate reports error:
> 3:49:31,397 INFO [TableMetadata] table found: configuration.userdb_domain_acl
> 13:49:31,397 INFO [TableMetadata] columns: [id, enabled, tablename, domain]
> 13:49:31,397 WARN [ServiceController] Problem starting service persistence.units:ear=msmgui.ear,unitName=msmgui
> javax.persistence.PersistenceException: org.hibernate.HibernateException: Wrong column type: enabled, expected: varchar(
> 2)
> at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698)
> at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:127)
> at org.jboss.ejb3.entity.PersistenceUnitDeployment.start(PersistenceUnitDeployment.java:264)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> Annotations should look like this:
> @Column(name = "enabled")
> @Type(type="booleanEnum")
> public Boolean getEnabled() {
> ...
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the hibernate-issues
mailing list