i trying generate jpa annotated java class using hyperjaxb, have hit 1 problem. suggestion welcome :-
partial ..pom.xml
<!-- hyperjaxb --> <dependency> <groupid>org.jvnet.jaxb2_commons</groupid> <artifactid>jaxb2-basics-runtime</artifactid> <version>0.6.4</version> </dependency> <dependency> <groupid>org.jvnet.hyperjaxb3</groupid> <artifactid>maven-hyperjaxb3-plugin</artifactid> <version>0.5.6</version> </dependency> ... <plugin> <artifactid>maven-compiler-plugin</artifactid> <version>3.3</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupid>org.jvnet.hyperjaxb3</groupid> <artifactid>maven-hyperjaxb3-plugin</artifactid> <version>0.5.6</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> <executions> <execution> <id>1</id> <goals> <goal>generate</goal> </goals> <configuration> <forceregenerate>true</forceregenerate> <schemadirectory>${basedir}/src/main/resources/schemas/demo</schemadirectory> <schemaincludes> <schemainclude>demo.xsd</schemainclude> </schemaincludes> <generatepackage>com.fsi.demo</generatepackage> <strict>true</strict> <extension>true</extension> </configuration> </execution> </executions> </plugin>
here demo.xsd:-
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> <xs:element name="demo"> <xs:complextype> <xs:sequence> <xs:element ref="playerid" /> <xs:element ref="g"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="playerid" type="xs:string" /> <xs:element name="g" type="xs:string" /> </xs:schema>
here generated java class
public class demo implements equals, hashcode { @xmlelement(required = true) protected string playerid; @xmlelement(name = "g", required = true) protected string g; @xmlattribute(name = "hjid") protected long hjid; .... ... /** * gets value of g property. * * @return * possible object * {@link string } * */ @basic @column(name = "g_", length = 255) public string getg() { return g; } /** * sets value of g property. * * @param value * allowed object * {@link string } * */ public void setg(string value) { this.g = value; } }
the underscore @column(name = "g_", length = 255) breaking code hibernate complains invalid column mapping.
what tried far, had no effect on problem:- 1) inline custom binding in demo.xsd
<xs:annotation> <xs:appinfo> <jxb:property name="g" /> </xs:appinfo> </xs:annotation>
and
<xs:annotation> <xs:appinfo> <orm:attribute-override name="g"> <orm:column name="g" /> </orm:attribute-override> </xs:appinfo> </xs:annotation>
what missing here, please!
update: hibernate query below:- hibernate:
select demo0_.playerid playerid1_0_, demo0_.g_ g_2_0_ demo demo0_ demo0_.playerid in ( ? )
trace:
caused by: com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception: unknown column 'demo0_.g_' in 'field list' @ sun.reflect.nativeconstructoraccessorimpl.newinstance0(native method) @ sun.reflect.nativeconstructoraccessorimpl.newinstance(nativeconstructoraccessorimpl.java:62)
and rightly actual column g , not g_ generated hyperjaxb, changing g (manually) solves issue
from experience, hyperjaxb add underscore end of column (and suspect table?) name, if name of column reserved word in sql dialect.
e.g. we're using sql server, , our xml source has attribute called value. when gets created column in database, called value_
value isn't reserved word in t-sql (sql server), in pl/sql (oracle). hazard guess name reserved word in sql dialect somewhere!
i've overridden column names in bindings file around :)
hope helps!
edited include examples of bindings cutomization:
here's example rename table, has underscore @ end:
<!-- make table name 'instance' rather 'instance_' --> <jaxb:bindings node="xs:element[@name='instance']//xs:complextype"> <hj:entity> <orm:table name="instance" /> </hj:entity> </jaxb:bindings>
here's example renaming column:
<!-- make periodstart , periodend columns have right name (instead of periodenditem --> <jaxb:bindings node="xs:element[@name='instanceperiod']//xs:complextype//xs:sequence//xs:element[@ref='periodend']"> <hj:basic> <orm:column name="periodend" /> </hj:basic> </jaxb:bindings>
Comments
Post a Comment