Hibernate - перемещение аннотаций с уровня свойства (метода) на уровень поля - PullRequest
11 голосов
/ 07 декабря 2009

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

Ценю вашу помощь и время.

Ответы [ 3 ]

15 голосов
/ 29 мая 2012

Вот шаги:

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

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

  3. В папке [Your Project] \ template \ pojo создайте файл с именем "Ejb3FieldGetAnnotation.ftl"

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

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

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

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

    ==================================================================================
    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>
    

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

1 голос
/ 03 мая 2016

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

In Intellij:

  1. Создайте файл 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;
...
}
0 голосов
/ 06 мая 2010

в настоящее время необходимо использовать пользовательские шаблоны. Вот еще ссылки и примеры горячих для реализации этого: https://forum.hibernate.org/viewtopic.php?f=6&t=1003858&p=2429868#p2429868

...