2015-02-27 2 views
2

мне было интересно, можно ли создать из JPA/спящий режим аннотацию описание столбца базы данных/комментарий, как это:JPA @column аннотацию, чтобы создать комментарий/описание

ALTER TABLE tablename CHANGE status status INT(11) NOT NULL COMMENT 'sample description/comment';

Это будет большой функциональностью, но Я не могу найти что-либо об этом в спецификации JPA.

Может быть, я должен использовать свойство @Column(columnDefinition=""), но у меня нет подсказки. Пожалуйста, помогите

ответ

6

Я нашел ответ на свой вопрос.

Я не уверен, это нормально? Будет ли он работать для всех баз данных?

Обязательно он работает для mysql.

Вот рабочий код:

@Column(columnDefinition=" INT(11) NOT NULL COMMENT '0 for no action, 1 for executed, 2 for validated, 3 for aproved'") 
private int status; 
+0

он придает данный текст заявления создания, поэтому он работает до тех пор, как ColumnDefinition соответствует лежащей в основе БД – Zielu

+0

Поскольку не все поддержки РСУБД «COMMENT» против COLUMN (Postgresql, HSQLDB, Дерби, чтобы назвать, но некоторые) то это, безусловно, будет работать только для очень ограниченного набора СУБД. Кроме того, включение в аннотацию означает, что скомпилированный код привязан к тем RDBMS, которые позволяют этот синтаксис, тогда как если бы вы поместили его в XML-файл, вы могли бы поменять файл orm.xml на основе используемой РСУБД. –

+0

Да. Я согласен с вами. Но не удалось найти лучшего решения. Что вы подразумеваете под XML? – masterdany88

2

Хотя Hibernate отображение необходимо для отображения доменных моделей для реляционных данных, это не очень хорошая идея, чтобы растянуть эту функцию для создания схемы базы данных тоже.

Это может работать для относительно небольшого проекта, но когда у вас есть приложение среднего и крупного предприятия, которое развивается с каждой итерацией Sprint, вам понадобится инструмент миграции схемы базы данных, например Flyway.

Комментарий не требует сопоставления модели домена, так как это реляционное специфическое описание. Модель домена должна использовать JavaDocs для документирования каждого значения поля (в соответствии с определенным требованием логики домена).

+0

Спасибо. Хорошо, что Ты указал на меня. – masterdany88

+1

Следует отметить, что вы должны синхронизировать схему БД и сгенерированную модель. В противном случае вы рано или поздно столкнетесь с проблемой, когда что-то изменится. Обычно у меня есть автоматические тесты, которые сравнивают перенесенные (используя пролетные пути как указано) и сгенерированные схемы. –

+0

Справа. Я также добавляю тесты соответствия схемы. –

1

Описание комментария уже существует для Таблица аннотации. Для этого мы должны использовать аннотацию Hibernate @Table, дополняющую аннотацию JPA @Table.

Например:

@javax.persistence.Table(name = "Cat") 
@org.hibernate.annotations.Table(comment = "Table for cats") 
public class Cat { 
... 

Что касается комментария столбца: Кажется, нет никакого эквивалента, даже в Hibernate 5.2/JPA 2.1.

Была проблема, представленная давным-давно (2007) по этому вопросу, но все еще не решена: Support @Comment or column attribute on @Table and @Column. Заброшены с 2012 года?

Я также нашел применение в комментарий org.hibernate.dialect.Dialect:

/** 
* Does this dialect/database support commenting on tables, columns, etc? 
* 
* @return {@code true} if commenting is supported 
*/ 
public boolean supportsCommentOn() { 
    return false; 
} 

/** 
* Get the comment into a form supported for table definition. 
* 
* @param comment The comment to apply 
* 
* @return The comment fragment 
*/ 
public String getTableComment(String comment) { 
    return ""; 
} 

/** 
* Get the comment into a form supported for column definition. 
* 
* @param comment The comment to apply 
* 
* @return The comment fragment 
*/ 
public String getColumnComment(String comment) { 
    return ""; 
} 

Например PostgreSQL81Dialect поддерживает его (supportsCommentOn() возвращает истину).

Он позволяет использовать команду SQL «COMMENT ON ...», , как в PostgreSQL (https://www.postgresql.org/docs/current/static/sql-comment.html).
Например:

COMMENT ON TABLE my_schema.my_table IS 'Employee Information'; 
COMMENT ON COLUMN my_table.my_column IS 'Employee ID number'; 

Это, кажется, используется там: org.hibernate.tool.schema.internal.StandardTableExporter # getSqlCreateStrings

комментарий колонны извлекают из спящего режима отображения с org.hibernate.mapping.Column # getComment.

Наконец, при использовании Hibernate Tools и обратное проектирование, комментарий столбца извлекается из JDBC DatabaseMetaData с org.hibernate.cfg.reveng.BasicColumnProcessor # processBasicColumns.

-> String comment = (String) columnRs.get("REMARKS"); 
Смежные вопросы