Можно ли установить значение по умолчанию для столбцов в JPA, и если, как это делается с использованием аннотаций?
java
jpa
annotations
homaxto
источник
источник
Ответы:
На самом деле это возможно в JPA, хотя немного взломать, используя
columnDefinition
свойство@Column
аннотации, например:источник
insertable=false
если столбец обнуляемый (и чтобы избежать ненужного аргумента столбца).Вы можете сделать следующее:
Там! Вы только что использовали ноль в качестве значения по умолчанию.
Обратите внимание, что это будет вам полезно, если вы обращаетесь к базе данных только из этого приложения. Если другие приложения также используют базу данных, вы должны выполнить эту проверку из базы данных, используя атрибут аннотации columnDefinition Камерона , или каким-либо другим способом.
источник
Example
объект в качестве прототипа для поиска. После установки значения по умолчанию пример запроса Hibernate больше не будет игнорировать связанный столбец, где ранее он игнорировал его, поскольку он был нулевым. Лучше всего установить все значения по умолчанию непосредственно перед вызовом Hibernatesave()
илиupdate()
. Это лучше имитирует поведение базы данных, которая устанавливает значения по умолчанию при сохранении строки.null
например). Использование@PrePersist
и@PreUpdate
является лучшим вариантом imho.columnDefinition
свойство не зависит от базы данных и@PrePersist
переопределяет ваши настройки перед вставкой, «значение по умолчанию» - это нечто другое, значение по умолчанию используется, когда значение не задано явно.Другой подход заключается в использовании javax.persistence.PrePersist
источник
if (createdt != null) createdt = new Date();
или что-то? Прямо сейчас это переопределит явно указанное значение, которое, по-видимому, не будет по умолчанию.if (createdt == null) createdt = new Date();
null
проверка.В 2017 году в JPA 2.1 остается только то,
@Column(columnDefinition='...')
к чему вы добавили буквальное определение SQL столбца. Что довольно негибко и заставляет вас также объявлять другие аспекты, такие как тип, кратко излагая взгляд реализации JPA по этому вопросу.Hibernate, хотя, имеет это:
Два примечания к этому:
1) Не бойтесь идти нестандартно. Работая в качестве разработчика JBoss, я видел довольно много процессов спецификации. Спецификация в основном является базовой линией, которую крупные игроки в данной области готовы взять на себя обязательство поддержать в течение следующего десятилетия или около того. Это верно для безопасности, для обмена сообщениями, ORM не имеет значения (хотя JPA охватывает довольно много). Мой опыт как разработчика заключается в том, что в сложных приложениях рано или поздно вам все равно понадобится нестандартный API. И
@ColumnDefault
это пример, когда он перевешивает недостатки использования нестандартного решения.2) Приятно, что все машут инициализацией @PrePersist или членом конструктора. Но это не то же самое. Как насчет массовых обновлений SQL? Как насчет утверждений, которые не устанавливают столбец?
DEFAULT
имеет свою роль, и это не может быть заменено путем инициализации члена класса Java.источник
JPA не поддерживает это, и было бы полезно, если бы это было. Использование columnDefinition зависит от БД и во многих случаях неприемлемо. установка значения по умолчанию в классе недостаточна, когда вы извлекаете запись с нулевыми значениями (что обычно происходит при повторном запуске старых тестов DBUnit). Что я делаю, так это:
Java-бокс помогает в этом.
источник
Видя, как я наткнулся на это от Google, пытаясь решить ту же самую проблему, я просто добавлю решение, которое я приготовил, на случай, если кто-то посчитает его полезным.
С моей точки зрения, на самом деле есть только 1 решение этой проблемы - @PrePersist. Если вы делаете это в @PrePersist, вы должны проверить, установлено ли уже значение.
источник
@PrePersist
вариант использования ОП.@Column(columnDefinition=...)
не выглядит очень элегантноЯ только что проверил проблему. Работает просто отлично. Спасибо за подсказку.
О комментариях:
Этот не устанавливает значение столбца по умолчанию в базе данных (конечно).
источник
Вы можете использовать Java отражает API:
Это распространено:
источник
Field[] fields = object.getClass().getDeclaredFields();
в такжеfor()
может быть хорошо. А также добавьтеfinal
в ваш параметр / перехваченные исключения, так как вы не хотите, чтобыobject
их модифицировали случайно. Кроме того, добавить проверку наnull
:if (null == object) { throw new NullPointerException("Parameter 'object' is null"); }
. Это гарантирует, чтоobject.getClass()
это безопасно для вызова и не вызываетNPE
. Причина в том, чтобы избежать ошибок ленивых программистов. ;-)Я использую,
columnDefinition
и это работает очень хорошоисточник
Вы не можете сделать это с аннотацией столбца. Я думаю, что единственный способ - установить значение по умолчанию при создании объекта. Может быть, конструктор по умолчанию будет правильным местом для этого.
источник
@Column
вокруг. И я также скучаю по комментариям (взятым из Java doctag).В моем случае я изменил исходный код ядра Hibernate, ну, чтобы ввести новую аннотацию
@DefaultValue
:Ну, это решение только для гибернации.
источник
@Column(columnDefinition='...')
не работает при установке ограничения по умолчанию в базе данных при вставке данных.insertable = false
и удалитьcolumnDefinition='...'
из аннотации, тогда база данных автоматически вставит значение по умолчанию из базы данных.insertable = false
в Hibernate / JPA, это будет работать.источник
В моем случае из-за поля LocalDateTime я использовал это, это рекомендуется из-за независимости поставщика
источник
Ни JPA, ни аннотации Hibernate не поддерживают понятие значения столбца по умолчанию. Чтобы обойти это ограничение, установите все значения по умолчанию непосредственно перед вызовом Hibernate
save()
илиupdate()
в сеансе. Это настолько близко, насколько это возможно (если не считать Hibernate, устанавливающий значения по умолчанию), имитирующее поведение базы данных, которая устанавливает значения по умолчанию при сохранении строки в таблице.В отличие от установки значений по умолчанию в классе модели, как предполагает этот альтернативный ответ , этот подход также гарантирует, что запросы критериев, которые используют
Example
объект в качестве прототипа для поиска, будут продолжать работать как прежде. Когда вы устанавливаете значение по умолчанию для атрибута, допускающего значение NULL, (атрибута, который имеет непримитивный тип) в классе модели, запрос Hibernate по примеру больше не будет игнорировать связанный столбец, где ранее он игнорировал его, поскольку он был нулевым.источник
Это невозможно в JPA.
Вот что вы можете сделать с аннотацией столбца: http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html
источник
Если вы используете двойной, вы можете использовать следующее:
Да, это специфично для БД.
источник
Вы можете определить значение по умолчанию в конструкторе базы данных или при создании таблицы. Например, в SQL Server вы можете установить хранилище по умолчанию для поля Дата в (
getDate()
). Используйте,insertable=false
как указано в определении вашего столбца. JPA не будет указывать этот столбец на вставках, и база данных сгенерирует значение для вас.источник
Вам нужно
insertable=false
в вас@Column
аннотации. JPA будет игнорировать этот столбец при вставке в базу данных, и будет использоваться значение по умолчанию.Смотрите эту ссылку: http://mariemjabloun.blogspot.com/2014/03/resolved-set-database-default-value-in.html
источник
nullable=false
потерпит неудачу сSqlException
:Caused by: java.sql.SQLException: Column 'opening_times_created' cannot be null
. Здесь я забыл установить «созданную» метку времени с помощьюopeningTime.setOpeningCreated(new Date())
. Это хороший способ иметь последовательность, но это то, что спрашивающий не спрашивал.