Defina o tempo de criação e atualização com o Hibernate em mapeamentos XML
-
26-09-2019 - |
Pergunta
Estou usando hibernado com Xml mapeamentos. Eu tenho uma entidade que tem dois campos data de criação e data de atualização do tipo timestamp
, que devem ser preenchidos com o tempo atual do UTC em que a entidade é persistida e atualizada. Eu sei sobre a existência do @PrePersist
e @PreUpdate
Anotações, mas não sei como usar o equivalente nos meus mapeamentos XML.
Novamente, eu queria saber se o Hibernate de alguma forma suporta de alguma forma o conjunto de tempo de atualização e criação.
Obrigado
Solução
Eu sei sobre a existência do
@PrePersist
e@PreUpdate
Anotações, mas não sei como usar o equivalente nos meus mapeamentos XML.
O hibernate3 Arquitetura de eventos fornece algo equivalente e você pode registrar ouvintes para PreInsertEvent
, PreUpdateEvent
ou SaveOrUpdateEvent
(Veja o org.hibernate.event
pacote para uma lista completa) para definir e atualizar as datas de criação/atualização.
Outra abordagem seria usar um interceptor, qualquer Session
-Scopado ou SessionFactory
-Scopado e para definir ambos createDate
e updateDate
dentro onSave(...)
, atualize o updateDate
dentro onFlushDirty(...)
.
Atualizar: Estou deixando minhas sugestões originais abaixo, mas acho que a abordagem certa (deveria ter sido minha resposta inicial) é usar um interceptador ou a arquitetura do evento.
Você poderia usar o generated
atributo do timestamp
para obter creationDate
e updateDate
gerado pelo banco de dados no inserto e no inserto e atualização, respectivamente:
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
Consulte a seção em Propriedades geradas Para detalhes completos.
Opção 1
Parece que timestamp
não suporta generatead
Portanto, minha sugestão não funcionará. No entanto, tendo lido a documentação com mais cuidado, meu entendimento é que timestamp
é uma alternativa ao versão e não acho que seja uma escolha apropriada para campos como createDate
e updateDate
(pode funcionar para o posterior, mas não é isso timestamp
é para).
Então eu ainda usaria Propriedades geradas mas com propriedades simples ao invés de timestamp
:
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<property name="createDate" update="false" insert="false" generated="insert" ... />
<property name="updateDate" update="false" insert="false" generated="always" ... />
...
</class>
No nível do banco de dados, isso exigiria o uso de um gatilho para updateDate
coluna. Para o createDate
coluna, usando algo como current_timestamp
como o valor padrão funcionaria bem. Mas os gatilhos talvez não sejam desejados ...
opção 2
Para evitar o gatilho do Opção 1, uma variação seria usar updateDate
para versão (e assim mapeá -lo como timestamp
):
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" ... />
<property name="createDate" update="false" insert="false" generated="insert" ... />
...
</class>
Mesma abordagem que a opção 1 para createDate
, use um valor padrão no nível do banco de dados.
Opção 3
Veja o topo desta resposta ...
Outras dicas
Os registros de data e hora em Hibernate são aparentemente sempre atualizados automaticamente quando a entidade muda, para que você não possa usar um <timestamp>
Mapeamento para a data da criação. No entanto, você pode armazená -lo como um simples java.util.Date
propriedade, inicializou com new Date()
.
Para o timestamp de atualização, tente o seguinte:
public class MyEntity {
...
private Date updateDate;
...
}
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
...
</class>
Observe que timestamp
deve vir logo depois id
no mapeamento.
FYI aqui está um referência do timestamp
atributos.