2016-08-01 1 views
2

Я пытаюсь создать аннотированный java-класс JPA с помощью hyperjaxb, но поразил одну проблему. Любое предложение приветствуется: -hyperjaxb extra underscore (_), сгенерированный в @column для некоторых столбцов одного символа

частичная ..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> 

Вот 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> 

Вот сгенерированного класса Java

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 the value of the g property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    @Basic 
    @Column(name = "G_", length = 255) 
    public String getG() { 
     return g; 
    } 

    /** 
    * Sets the value of the g property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setG(String value) { 
     this.g = value; 
    } 
} 

Дополнительное подчеркивание @ Колонна (имя = "G_", длина = 255) нарушает мой код, так как hibernate жалуется на недопустимое сопоставление столбцов.

То, что я пытался до сих пор, что не имел никакого влияния на эту проблему: - 1) Встроенные пользовательские привязки в demo.xsd

<xs:annotation> 
      <xs:appinfo> 
       <jxb:property name="G" /> 
      </xs:appinfo> 
     </xs:annotation> 

и

<xs:annotation> 
      <xs:appinfo> 
       <orm:attribute-override name="G"> 
        <orm:column name="G" /> 
       </orm:attribute-override> 
      </xs:appinfo> 
     </xs:annotation> 

что я здесь отсутствует, кто угодно!

ОБНОВЛЕНИЕ: спящий режим запроса ниже: - гибернации:

выберите demo0_.PLAYERID как PLAYERID1_0_, demo0_.G_, как G_2_0_ от ДЕМОНСТРАЦИОННОМ demo0_ где demo0_.PLAYERID в ( )

Просмотров:

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'demo0_.G_' in 'field list' 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 

и справедливо, как фактическая колонка G и НЕ G_, сгенерированный hyperjaxb, изменяя его G (вручную) решает эту проблему

+0

Почему отображение столбцов недопустимо? – lexicore

+0

, поскольку столбец, генерируемый гиперяксом, содержит дополнительные _ (** G _ ** вместо ** G **). ** NB: ** ОБНОВЛЕНО исходный вопрос с дополнительной информацией выше – AshDDN

+0

еще вопросы: XSD \t '' также генерирует имена столбцов с подчеркиванием (_), как ниже '@Basic @Column (name =" NAME_ ", length = 255) public String getName() { имя возврата; } ' – AshDDN

ответ

0

Из моего опыта, Hyperjaxb добавит подчеркивание в конце столбца (и я подозреваю имя таблицы?), если имя этого столбца является зарезервированным словом на любом диалекте SQL.

E.g. Мы используем SQL Server, а наш источник XML имеет атрибут VALUE. Когда это создается как столбец в базе данных, он называется VALUE_

VALUE на самом деле не является зарезервированным словом в T-SQL (SQL Server), но он находится в формате Pl/SQL (Oracle). Я бы рискнул предположить, что NAME - это зарезервированное слово на диалекте SQL где-то!

Я переопределены имена столбцов в привязок файл, чтобы обойти это :)

Надежда, что помогает!

отредактирован, чтобы включить примеры привязок cutomization:

Вот пример, где я переименовать таблицу, так как она имеет подчеркивание в конце:

<!-- Make table name 'INSTANCE' rather than 'INSTANCE_' --> 
     <jaxb:bindings node="xs:element[@name='Instance']//xs:complexType"> 
      <hj:entity> 
       <orm:table name="INSTANCE" /> 
      </hj:entity> 
     </jaxb:bindings> 

Вот пример для переименования столбца:

<!-- Make PeriodStart and PeriodEnd columns have the 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> 
+0

Спасибо @pieman, это полезно, я также предполагал, что это может быть не ошибка. Можете ли вы поделиться своим примером XSD и пользовательским связыванием или что мне нужно сделать в моем примере выше? – AshDDN

+0

Не беспокойтесь, @AshDDN! Отредактировал мой ответ, чтобы включить примеры настройки привязок. Мое предположение заключается в том, что отдельные буквы получают после них подчеркивание, поскольку они обычно используются в качестве псевдонимов таблицы? – pieman

Смежные вопросы