×Закрыть

Тонкости генерации Entity-классов в IDEA

Доброго дня, уважаемые Java-гуру
встретил недавно в коде Entity-класса коллеги

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }
удивило, что в данном случае @Id возле метода, а не возле самого поля. при этот в примерах, которые я видел аннотация @Id используется с полем, а не с методом
к примеру тут
   @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name= "increment", strategy= "increment")
    @Column(name = "id", length = 6, nullable = false)
    private long id;
коллега ссылается на авторитет разработчиков IDEA, которые знают как правильно генерировать Entity-классы. мне же все-таки интересен ответ, какой вариант кода лучше/правильнее/красивее. можете поделиться мнением?
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

кстатии, а какая практика более популярна/правильна? Когда по готовой структуре базы данных генерируется набор java entity или же когда разработчики изначально пишут вручную все java entity, а потом spring/hibernate на их основе генерирует структуру базы данных?

Меня сейчас забросают камнями, но...
Аннотируем поля + юзаем lombok, что бы не видеть эту гору сеттеров/геттеров/туСтрингов/хэшКодов/иквалсов :)

ага, а потім в екліпсі коли хтось дивиться твій код то починає жостко плюватись бо нереально знайти всі виклики конкретного сетера або гетера

которые знают как правильно генерировать Entity-классы

Ох уж это правильно. Аннотировать допускается как поля, так и методы. При этом не смешивая. Если что — в Eclipse при генерации в визарде галку ставишь на поля или на методы кидать. Лично я предпочитаю минимальный набор при генерации. Чтобы не копипастить поля в базе и не набирать имена полей. Все аннотации сложнее @Column пишу сам руками.

Это вводит в небольшой ступор. Подобная аннотация относится непосредственно к свойству сущности, она должна быть на своем месте.

Я нарыл по этому поводу в основном различный холивар. Кто-то считает что лучше аннотации на методах, потому что это позволяет добавлять туда дополнительную логику, кто-то считает это дурным тоном. Есть какой-то баг в Хайбернейте hibernate.atlassian.net/browse/HHH-3718 из-за которого «выгоднее» кидать аннотации на методы. Мануал ничего внятного не говорит:

«It is recommended to stick to one single annotation placement strategy throughout your whole application.»
, но в нем самом аннотации кидаются на методы. Из мануала спринга можно выдрать фразу из контекста:
«Field-level annotations concise and easier to use while method-level allow for processing the injected dependency.»
В JPA мануале также похоже ответа не замечено:
Entities may use persistent fields, persistent properties, or a combination of both. If the mapping annotations are applied to the entity’s instance variables, the entity uses persistent fields. If the mapping annotations are applied to the entity’s getter methods for JavaBeans-style properties, the entity uses persistent properties.
В общем я понаходил по этому поводу еще несколько мнений, которые в основном крутятся вокруг прокси/производительности/соображений инкапсуляции и т.д. но никакого однозначного внятного ответа.
Я уверен где-то какой-то гуру типа Гослинга пояснил за это по-хардкору, но на самом деле думаю выбор между подходами не особо критичный.

Подписаться на комментарии