Définition d'une JPA colonne de type timestamp à être généré par la base de données?
Dans mon SQL Server 2000, base de données, j'ai un timestamp (en fonction non pas de type de données) de la colonne de type DATETIME
nommé lastTouched
ensemble de getdate()
comme valeur par défaut/de liaison.
J'utilise Netbeans 6.5 généré JPA classes d'entité, et dans mon code
@Basic(optional = false)
@Column(name = "LastTouched")
@Temporal(TemporalType.TIMESTAMP)
private Date lastTouched;
Cependant lorsque j'essaie de mettre l'objet dans la base de données que je reçois,
javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.generic.Stuff.lastTouched
J'ai essayé de réglage de la @Basic
à (optional = true)
, mais qui génère une exception à dire la base de données ne permet pas null
valeurs pour les TIMESTAMP
colonne, dont il n'a pas de par leur conception.
ERROR JDBCExceptionReporter - Cannot insert the value NULL into column 'LastTouched', table 'DatabaseName.dbo.Stuff'; column does not allow nulls. INSERT fails.
J'ai déjà eu ce travail dans la pure mise en veille prolongée, mais j'ai le sentiment basculé JPA et n'ont aucune idée de la façon de dire ce que cette colonne est supposé être généré sur la base de données secondaires. Notez que je suis toujours à l'aide d'Hiberner comme mon JPA couche de persistance.
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème en changeant le code de
De sorte que la colonne timestamp est ignoré lors de la génération de SQL insert. Vous ne savez pas si c'est la meilleure façon d'aller à ce sujet. Commentaires sont les bienvenus.
Je réalise que c'est un peu tard, mais j'ai eu du succès avec l'annotation d'une colonne de type timestamp avec
Cela devrait également travailler avec
CURRENT_DATE
etCURRENT_TIME
. Je suis en utilisant JPA/Hibernate, Oracle, de sorte YMMV.insertable=false, updatable=false
ERROR 4371 --- [ main] org.hibernate.tool.hbm2ddl.SchemaExport : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '
HORODATAGE par DÉFAUT CURRENT_TIMESTAMP` not null,full_content
longtext pas null', à la ligne 1. My column is:
@Column(nullable = false, nom="created_at", pouvant être mis à jour = false, columnDefinition="TIMESTAMP par DÉFAUT CURRENT_TIMESTAMP")` etprivate Timestamp createdAt;
cela a fonctionné pour moi.
plus d'infos
J'ai ce travail bien à l'aide de JPA2.0 et MySQL 5.5.10, pour les cas où je ne se soucient que la dernière fois que la ligne a été modifiée. MySQL va créer un horodatage sur la première insertion, et à chaque fois la mise à JOUR est appelé sur la ligne. (REMARQUE: cela va être problématique si je m'en souciais de savoir si ou non la mise à JOUR effectué un changement).
Le "timestamp" colonne dans cet exemple, c'est comme un "dernier-touché" de la colonne.x`
Le code ci-dessous utilise une colonne "version" pour le verrouillage optimiste.
(NOTE: @Version ne fonctionne pas sur une base de données MySQL "DATETIME" colonne, où l'attribut est de type "Date" dans la classe d'Entité. C'est parce que la Date était de générer une valeur de l'ordre de la milliseconde, cependant MySQL n'était pas le stockage de l'ordre de la milliseconde, donc quand il fait une comparaison entre ce qui a été à la base de données, et le "joint" de l'entité, il pensait qu'ils avaient des numéros de version différents)
À partir de la base de données MySQL manuel concernant l'HORODATAGE :
Je ne pense pas que chaque base de données est mise à jour automatique des horodateurs (par exemple, Postgres). J'ai donc décidé de mettre à jour ce champ manuellement partout dans mon code. Cela fonctionne avec toutes les bases de données:
Il y a des raisons pour utiliser des déclencheurs, mais pour la plupart des projets, ce n'est pas l'un d'eux. Les déclencheurs de vous creuser encore plus profondément dans une base de données spécifique de mise en œuvre.
MySQL 5.6.28 (Ubuntu 15.10, OpenJDK 64 Bits 1.8.0_66) semble être très indulgent, ne nécessitant pas de quelque chose au-delà
MySQL 5.7.9 (CentOS 6, OpenJDK 64 Bits 1.8.0_72) fonctionne uniquement avec
pas:
Mes autres infos sur le système (identique dans les deux milieux)