hyperjaxb дополнительное подчеркивание (_), сгенерированное в @column для некоторых односимвольных столбцов

Я пытаюсь сгенерировать java-класс, аннотированный JPA, используя hyperjaxb, но столкнулся с одной проблемой. Любое предложение приветствуется:-

частичное..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;
    }
}

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

Что я пробовал до сих пор, но это никак не повлияло на проблему:- 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>

что я здесь скучаю, кто-нибудь, пожалуйста!

ОБНОВЛЕНИЕ: запрос Hibernate ниже:- Hibernate:

выберите demo0_.PLAYERID в качестве PLAYERID1_0_, demo0_.G_ в качестве G_2_0_ из DEMO 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 (вручную) решает эту проблему

1 ответ

Решение

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

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

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

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

Надеюсь, это поможет!

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

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

<!-- 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>
Другие вопросы по тегам