web-dev-qa-db-fra.com

Évitez d'insérer des valeurs 'null' dans la table de la base de données via JPA

je commence avec JPA2 et je me sens assez confortable jusqu'à présent. Mais j'ai un problème lorsque des entités persistantes avec des valeurs de propriété nulles pour des champs de base de données NON NULL avec une valeur par défaut sont conservées.

J'aimerais pouvoir laisser la propriété d'entité null et laisser la base de données insérer la valeur par défaut.

Ma configuration actuelle est openJPA avec PostgreSQL.

J'ai cette table de base de données VERSION (Vorgabewert = valeur par défaut):


     Spalte     |             Typ             |         Attribute
----------------+-----------------------------+----------------------------
 status_        | smallint                    | not null Vorgabewert 0
 time_          | timestamp without time zone | not null
 system_time    | timestamp without time zone | not null Vorgabewert now()
 version        | character varying(20)       | not null
 activationtime | timestamp without time zone |
 importtime     | timestamp without time zone |

J'ai une entité (Java DTO) qui mappe les champs de la base de données (sauf 'status') par la configuration xml.

J'espérais pouvoir insérer une entité sans l'ensemble system_time et m'attendais à ce que la base de données remplisse l'heure actuelle comme valeur par défaut.

JPA construit la requête SQL suivante:

INSERT INTO public.version (version, activationtime, importtime, system_time, time_) VALUES (?, ?, ?, ?, ?) [params=?, ?, ?, ?, ?]

et Postgres réagit avec:

FEHLER: NULL-Wert in Spalte »system_time« verletzt Not-Null-Constraint (désolé pour l'allemand, mais ce message signifie que la violation Not-Null-Constraint sur 'heure_système').

Alors qu'est-ce que je peux faire? Est-ce un problème de JPA ou de base de données? Puis-je configurer JPA pour exclure les propriétés null de l'instruction INSERT SQL.

Je veux avoir la possibilité de définir le 'heure_système' dans mon entité ou de le laisser être 'nul' et de laisser la base de données mettre la valeur par défaut.

Toute aide est la bienvenue!

Regads Klaus

17
FrVaBe

Je ne m'appuierais pas sur les valeurs par défaut de la base de données en conjonction avec JPA. Vous devrez relire l'entité après l'insertion, sinon vous aurez une incompatibilité entre l'état de l'entité et l'état de la base de données.

Choisissez ici l'approche pragmatique et initialisez toutes les valeurs en Java. Jamais entendu parler d'un moyen de dire à JPA/Hibernate de laisser de côté les valeurs nulles dans un insert/update.

17
bert

Utiliser l'annotation

@Column(insertable = false)

empêchera que la valeur soit générée dans le SQL.

20
OrangeDog

Dans l'annotation @Colonne mettre l'attribut insérable à faux comme ça:

 `@Column (name =" heure_système ", insertable = false) «

Ou si vous avez besoin de vérifier lorsque la valeur est NULL, créez un déclencheur AVANT INSÉRER sur la table.

5

De la documentation: columnDefinition: Le fragment SQL utilisé lors de la génération du DDL pour la colonne.

A l'aide de columnDefinition, vous pouvez spécifier des contraintes si nécessaire.

@Column (name = "COLUMN_NAME", columnDefinition = "DATE ​​DEFAULT CURRENT_DATE", table = "TABLE_NAME")

Sinon, vous pouvez essayer d'initialiser le champ dans l'entité elle-même pour vous en débarrasser.

@Column(name = "somedate", nullable = false)
private Date someDate = new Date();

Donc, par défaut, la date actuelle sera insérée si vous ne la définissez pas.

2
Nayan Wadekar

J'ai trouvé une solution simple: définir une valeur par défaut dans le pojo.

@Column(name="system_time")
private Date systemTime = new Date();
0
xeon_pan

J'utilise ceci (par rapport à une base de données Oracle):

@Temporal(TemporalType.TIMESTAMP)
@Column(name="CREATION_TIME", 
        columnDefinition="TIMESTAMP DEFAULT SYSTIMESTAMP",
        nullable=false,
        insertable=false,
        updatable=false)
private Date creationTime;
0
Jim Tough

vous pouvez éviter la propriété null en ajoutant nullable = false à l'annotation @column. comme ça

@Column(name = "muColumn", nullable = false)

comment éviter la propriété null dans insert ou update

0
user9247837