У меня есть таблицы, которые имеют эту структуру аннотаций в моем приложении, и я использую JpaRepository
для операций CRUD.
@Entity
@Table(name = "FOO")
public class Foo implements Serializable {
…
}
Но мне нужно переопределить только имя таблицы (не любые атрибуты @Column
и т.д.) Из orm.xml
или свойств без изменения фактического кода. Я искал, и я не мог найти способ сделать это в Spring Data JPA. Я что-то упустил или не поддерживается?
Во-первых, 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>