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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top