Как переопределить имя таблицы, определенной в аннотации, в JPA?

1

У меня есть таблицы, которые имеют эту структуру аннотаций в моем приложении, и я использую JpaRepository для операций CRUD.

@Entity
@Table(name = "FOO")
public class Foo implements Serializable {
  …
}

Но мне нужно переопределить только имя таблицы (не любые атрибуты @Column и т.д.) Из orm.xml или свойств без изменения фактического кода. Я искал, и я не мог найти способ сделать это в Spring Data JPA. Я что-то упустил или не поддерживается?

Теги:
jpa
spring-data-jpa

1 ответ

4
Лучший ответ

Во-первых, Spring Data не является поставщиком JPA, а просто "вспомогательной" библиотекой, обеспечивающей обертку вокруг общих операций сохранения. Однако спецификация JPA обеспечивает механизм переопределения аннотаций через файл сопоставления XML. Таким образом, если ваш провайдер (Hibernate, EclipseLink, OpenJPA или что-то еще) полностью реализует спецификацию JPA, тогда вы должны это сделать.

Однако кажется, что вы не можете переопределить только имя таблицы: если ваши имена столбцов не сопоставлены с значениями по умолчанию, то, насколько я вижу, вам нужно указать каждый столбец в файле сопоставления - что несколько неудобно, я полагаю.

Книга Pro JPA 2: Освоение Java API Persistence:

Атрибут metaata-complete - это атрибут сущности, сопоставленного суперкласса и встраиваемых элементов. Если указано, все аннотации по указанному классу и по любым полям или свойствам класса будут игнорироваться, и только метаданные в файле сопоставления будут рассматриваться как набор метаданных для этого класса. Когда функция metadata-complete включена, те же правила, которые мы применяли к аннотированным объектам, по-прежнему будут применяться при использовании XML-сопоставленных объектов. Например, идентификатор должен быть сопоставлен, и все отношения должны быть указаны с соответствующими сопоставлениями мощности в элементе сущности.

Таким образом, вам понадобится запись в вашем orm.xml, как показано ниже, добавив другие атрибуты по мере необходимости.

 <entity-mappings>
    <entity class="examples.Foo" metadata-complete="true">
        <table name="NEW_FOO"/>
        <attributes>
            <id name="id"/>
        </attributes>
    </entity>
</entity-mappings>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню