Как аннотировать атрибут в объекте, если атрибут таблицы имеет значение по умолчанию clock_timestamp ()? - PullRequest
1 голос
/ 08 января 2020

В базе данных Postgres у меня есть таблица с атрибутом "insert_time" (timestamptz), которая имеет значение по умолчанию функции clock_timestamp ().

В Java я создал объект из таблицы, но когда мне нравится вставлять новую запись в таблицу, insert_time имеет значение null вместо clock_timestamp ().

Как правильно аннотировать сущность, чтобы, если insert_time не было передано в Java что "значение по умолчанию" clock_timestamp () используется в самой таблице?

или как читать clock_timestamp () в сущности, если атрибут имеет значение null.

спасибо

Ответы [ 2 ]

1 голос
/ 08 января 2020

Пожалуйста, попробуйте это:

 @PrePersist
 public void setDefaultTime(BaseEntity entity) {
   if(entity.getInsertTime() == null) {
       entity.setInsertTime(new Timestamp((new Date()).getTime())):
   }
}
1 голос
/ 08 января 2020

Вы не можете просто аннотировать сущность JPA и получить значение, возвращаемое функцией clock_timestamp()

Чтобы получить это значение в своем коде, вам нужно будет выполнить запрос

SELECT clock_timestamp();

Но вы можете использовать JPA-слушатели для достижения чего-то похожего:

public class TimestampEntityListener {
    @PrePersist
    public void setDefaultTime(BaseEntity entity) {
       if(entity.getInsertTime() == null) {
           entity.setInsertTime(new Timestamp((new Date()).getTime())):
       }
    }
}

@MappedSuperclass
@EntityListeners({TimestampEntityListener.class})
public abstract class BaseEntity {...}

Теперь, если вы действительно заинтересованы в том, чтобы БД контролировала время вставки, а не делегировала ваше приложение Сделав это, вы можете изменить приведенный выше код и подключить к нему EntityManager, чтобы вы могли выполнить этот выбор для БД и просто установить это значение напрямую.

Обновление: о том, как делегировать entityListener для запроса к базе данных

public class TimestampEntityListener {
        @Autowired
        EntityManager entityManager;

        @PrePersist
        public void setDefaultTime(BaseEntity entity) {
           AutowireHelper.autowire(this, this.entityManager);
           if(entity.getInsertTime() == null) {
               Timestamp timestamp = (Timestamp)entityManager.createNativeQuery("select clock_timestamp()").getSingleResult();
               entity.setInsertTime(timestamp):
           }
        }
    }

Вы можете использовать этот класс для AutowireHelper и с указанным выше кодом он должен работать из коробки, пока ваши сущности будут расширять BaseEntity .

...