Подтвердить что ты не робот

Hibernate - перемещение аннотаций от уровня свойства (метода) до уровня поля

Как мне сгенерировать классы домена спящего режима из таблиц с аннотациями на уровне поля? Я использовал проект Hibernate Tools и сгенерировал классы домена из таблиц в базе данных. Сгенерированные классы имеют аннотации к методам геттера, а не на уровне поля. Просьба посоветовать способ создания классов домена, которые имеют аннотированные поля. Есть ли какие-либо объекты рефакторинга в eclipse/IDEA и т.д., Чтобы переместить аннотации с уровня метода на уровень поля?

Цените свою помощь и время.

4b9b3361

Ответ 1

Вот шаги:

  • Выделите "hibernate-tools.jar", выполнив поиск в вашей папке eclipse Например, вы найдете его на C:\eclipse\plugins\org.hibernate.eclipse_3.4.1.xxx\lib\tools

  • Извлечение в временную папку (WinRar может это сделать) Например, извлеките в [Your Project]\template

  • В папке [Ваш проект]\шаблон\pojo создайте файл с именем "Ejb3FieldGetAnnotation.ftl"

    Этот файл на самом деле является копией "Ejb3PropertyGetAnnotation.ftl", но все слова "свойство" заменяются "полем", потому что этот файл будет помещен в цикл, который выполняет итерацию через все поля (вместо свойств). Я включаю содержимое файла в этот пост

  • Удалить аннотации на уровне свойств: В файле "PojoPropertyAccessors.ftl" удалите или закомментируйте

    <#include "GetPropertyAnnotation.ftl"/>
    
  • Добавить аннотации на уровне поля: В файле "PojoFields.ftl" добавьте

    <#include "Ejb3FieldGetAnnotation.ftl"/>
    ${pojo.getFieldModifiers(field)} ... 
    
  • При создании объектов Java выберите "Использовать настраиваемые шаблоны" и укажите папку шаблона. В этом случае это будет [Ваш проект]\шаблон

    ==================================================================================
    Ejb3FieldGetAnnotation.ftl
    ==================================================================================
    
    <#if ejb3>
    <#if pojo.hasIdentifierProperty()>
    <#if field.equals(clazz.identifierProperty)>
     ${pojo.generateAnnIdGenerator()}
    <#-- if this is the id property (getter)-->
    <#-- explicitly set the column name for this property-->
    </#if>
    </#if>
    
    <#if c2h.isOneToOne(field)>
    ${pojo.generateOneToOneAnnotation(field, cfg)}
    <#elseif c2h.isManyToOne(field)>
    ${pojo.generateManyToOneAnnotation(field)}
    <#--TODO support optional and targetEntity-->    
    ${pojo.generateJoinColumnsAnnotation(field, cfg)}
    <#elseif c2h.isCollection(field)>
    ${pojo.generateCollectionAnnotation(field, cfg)}
    <#else>
    ${pojo.generateBasicAnnotation(field)}
    ${pojo.generateAnnColumnAnnotation(field)}
    </#if>
    </#if>
    

Надеюсь, он сработает для вас.

Ответ 2

Я потратил много времени на чтение ответов от 5 лет назад, не понимая, как это сделать (особенно если вы работаете в Intellij, а не в Eclipse), и почему это еще не решено. Итак, я нашел его здесь, и это просто:

В Intellij:

  • Создайте файл orm.xml в той же папке, что и ваш persistence.xml с этим контентом
<?xml version="1.0" encoding="UTF-8"?>
    <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                     version="2.0">
        <persistence-unit-metadata>
            <persistence-unit-defaults>
                <access>FIELD</access>
            </persistence-unit-defaults>
        </persistence-unit-metadata>
    </entity-mappings>
  1. Теперь вы можете сгенерировать свои pojos (Создать отображение персистентности → по схеме базы данных → выбрать ваши таблицы и т.д. и не забудьте отметить "Генерировать аннотации JPA" )

У ваших объектов будут полевые аннотации!

@Entity
@Table(name = "user", schema = "public", catalog = "my_db")
public class User {
    @Id
    @Column(name = "id")
    private Integer id;
...
}