Как вывести данные столбца, если в классе стоит аннотация @Transient
Нужно вывести данные столбца, в классе date_create, есть аннотация @Transient. Если ее убрать то данные будут выводится, но тогда не будет заносится данные в столбец(дата и время)
Например Так выводится:
if(petit.getBlockger2016().getDate_change() != null) { aRow.createCell(46).setCellValue(petit.getBlockger2016().getDate_change().toString());}
else{ aRow.createCell(46).setCellValue(""); }
Но уже с Date_create показывает пустоту
if(petit.getBlockger2016().getDate_create() != null) { aRow.createCell(46).setCellValue(petit.getBlockger2016().getDate_create().toString());}
else{ aRow.createCell(46).setCellValue(""); }
В SQL:
date_change DATE
date_create DATE Default - sysdate
.java
private String date_create;
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd kk:mm:ss.S", timezone="GMT+6")
private Date date_change;
@Transient
public String getDate_create() {
return date_create;
}
public void setDate_create(String date_create) {
this.date_create = date_create;
}
public Date getDate_change() {
return date_change;
}
public void setDate_change(Date date_change) {
this.date_change = date_change;
}
@Override
public String toString() {
return "BlockGER2016 [idblockger2016=" + idblockger2016 + ", date_end=" + date_end + ", date_close="
+ date_close + ", letter_out_num=" + letter_out_num
+ ", letter_out_date=" + letter_out_date + ", regsource_id="
+ regsource_id + ", regname=" + regname + ", regnum=" + regnum
+ ", date_create=" + date_create + ", date_change="
+ date_change + ",inbound_from="+ inbound_from +",date_plan_end="+ date_plan_end +",claim_inshur="+ claim_inshur +"typempid="+typempid+" state=" + state + ",filecall ="+ filecall +"]";
}
.jsp
С аннотацией @Transient данные не выводятся
<td> ${petit.blockger2016.date_create}</td>
Ответы (1 шт):
Если правильно понял, чего Вы хотите, то правильный ответ будет такой.
@Transient заставляет полностью игнорировать свойство системой персистентности.
Ничего из него не сохраняет в базу, и ничего в него не загружает из базы.
Поэтому Ваш data_create всегда пустой.
@Transient не годится.
Если хотите загружать данные из базы, но не хотите их туда записывать, то поступают примерно так
@Column(insertable = false, updatable = false)
public String getDate_create() {
return date_create;
}
Т.е. даётся указание не вставлять и не обновлять поле. Но извлекать ещё можно.
Но это ещё не всё. У новой записи будет проставлено время, но у нового объекта нет. Нужно каким-то образом обновлять новые объект, чтобы в них попали данных, которые генерирует бд. Никогда не интересовался, есть ли средства автоматизации сего действия, но в крайнем случае поможет стандартный refresh после persist/merge.
Но это на мой взгляд не очень хорошо.
На всякий случай предложу свой вариант установки времени создания/изменения.
@Entity
public class MyEntity {
...
private Date created;
private Date updated;
...
public Date getCreated() {
return created;
}
public Date getUpdated() {
return updated;
}
...
@PrePersist
private void prePersist {
created = new Date();
updated = created;
}
@PreUpdate
private void preUpdate {
updated = new Date();
if (created == null) { // на всякий случай
created = updated;
}
}
...
}
Т.е. установка временных отметок осуществляется не бд, а приложением с помощью специальных обработчиков событий жизненного цикла сущности (@PrePersist и @PreUpdate).
Пару слов об SQL
Может не все ещё знают, что на самом деле значит date_create DATE Default - sysdate
Может кто-то думает, что если попытаться записать NULL в date_create, то SQL запишет туда sysdate? Так вот, это не так. SQL послушно запишет туда NULL:)
На самом деле sysdate будет записано только если в запросе нет вообще никакого упоминания поля date_create.
Когда нет злосчастного @Transient, тогда формируется примерно такой запрос к бд:
insert into my_table (id, data_create, name, ...) values (1, NULL, 'вася', ...)
или такой
insert into my_table (id, data_create, name, ...) values (1, '25/06/2021', 'вася', ...)
в зависимости от того чем заполнены свойства объекта.
и поле data_create получает значение из запроса, каковым бы оно не было.
Теперь поставим @Transient на data_create, тогда запрос будет таким
insert into my_table (id, name, ...) values (1, 'вася', ...)
data_create в запросе мы больше не видим. Не видит его и бд, и записывает в поле data_create его default, т.е. sysdate
Рассмотрим обратный поток данных из бд в объекты-сущности.
Пусть нет @Transient. Тогда запрос будет примерно таким
select id, data_create, name, ... from my_table
Т.е. видим, что из базы извлекается поле data_create и его значение будет записано в одноимённое свойство объекта и показано на страничке.
Опять вернём @Transient. Честно говоря, не знаю как поведёт себя hibernate, но предполагаю запрос будет таким
select id, name, ... from my_table
Т.е. значению для свойства data_create даже в принципе взяться не от куда. И соответственно на страничке видим не фигвам, конечно, но что-то похожее:)