orm.xml не отменяет аннотации - PullRequest
4 голосов
/ 06 января 2012

Я столкнулся с проблемой, когда JPA на Derby по умолчанию установил размер BLOB 64 КБ. Я могу решить эту проблему, установив columnDefinition = "BLOB (128M)" . Однако это не удается во время тестирования интеграции с другой СУБД, такой как MS SQL. Что я хотел бы сделать, это установить columnDefinition с помощью orm.xml. Однако мои попытки были тщетны, и я не могу заставить это работать. Похоже, что значения, установленные в orm.xml , переопределяют аннотации, как я и ожидал.

Я использую JPA 1.0, Toplink Essentials 2.1.60.

У меня есть следующая сущность, аннотированная как таковая:

package foo;

@Entity
@Table(name = "Attachment")
public class Attachment implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Version
    @Column(name = "VERSION")
    private Integer version;
    @Column(name = "FILE_NAME", nullable = false)
    private String name;
    @Lob
    @Basic
    @Column(name = "ATTACHED_FILE", nullable = false)
    private byte[] file;
}

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"         
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="LAS-OOC" transaction-type="RESOURCE_LOCAL">
        <provider>${jpa.provider}</provider>
        <!-- this isn't required, i know, but I'm trying everything I can think of -->
        <mapping-file>META-INF/orm.xml</mapping-file>
        <class>foo.Attachment</class>
        <properties>
        ...
        </properties>
    </persistence-unit>
</persistence>

orm.xml (находится в META-INF)

<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm 
      http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">

    <persistence-unit-metadata>
        <persistence-unit-defaults>
            <schema>TEST</schema>
        </persistence-unit-defaults>
    </persistence-unit-metadata>

    <entity class="foo.Attachment" access="FIELD" >
        <attributes>
            <basic name="file">
                <!-- 
                     I'm using maven profiles to set the 'jpa.blob.definition' property.  I even tried changing the column name.
                 --> 
                <column nullable="true" name="ATTACHED_FILE_MODIFIED" column-definition="${jpa.blob.definition}" />
            </basic>
        </attributes>
    </entity>
</entity-mappings>

Интересно отметить, что если я изменю класс сущности или атрибут базового имени в orm.xml, он пожалуется, что он недействителен / не найден. Это говорит мне о том, что он читает, но не переопределяет аннотацию, указанную для file . Даже схема по умолчанию не используется.

Разве orm.xml не предполагает переопределение аннотаций? Разве это не должно быть просто?

1 Ответ

2 голосов
/ 06 января 2012

разобрался с моей проблемой. Я не знал, что у проекта также было то же имя модуля персистентности, определенное в файле persistence.xml в тесте / ресурсах. Поэтому, когда я добавил

<mapping-file>META-INF/orm.xml</mapping-file>

к этому файлу persistence.xml, это сработало. Так что, да, похоже, есть ошибка с toplink, так как она должна обнаруживать это автоматически, но это не так. Я не могу поверить, что я не видел этого раньше. Вздох ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...