Hibernate manipulation de nullable=true dans la Colonne @
Je suis de l'utilisation d'Hibernate avec des Ressorts soutenu par une base Mysql.
Ici est l'entité qui est similaire à celui que j'utilise pour faire une entrée
@Entity
@Table(name = "my_table") {
@Basic
@Column(name = "my_string", nullable = false)
private String myString;
}
La définition sql est
CREATE TABLE `my_table` (
`my_string` varchar(200) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Si la table autorise les valeurs null, la colonne machaine est non nullable que par la JPA annotation. Cela conduit à des comportements imprévisibles.
Q: Est-ce le non nullable TOUJOURS appliquées au niveau de l'entité tout en faisant des semelles? Ou bien il y a certains cas dans lesquels il peut être ignoré
Mon attente est que toutes les entrées ont été rejetées. Mais avec cette configuration, le nombre d'entrées (>7000) ont disparu dans la table.
Seulement parfois, je reçois un DataIntegrityViolation exception de printemps
org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value: ...; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:652)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:403)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
....
....
Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: ....
at org.hibernate.engine.internal.Nullability.checkNullability(Nullability.java:103)
....
Je comprends que le fait d'avoir séparé la signature de l'entité et la table est une mauvaise pratique, Mais je vais essayer d'identifier quelles sont les causes de ce comportement et de toutes les autres lacunes qui pourraient avoir été laissé de côté à cause d'elle.
Versions -
Mysql- 5.5
Hibernate - 4.0.0
Hibernate-jpa - 2.0
Spring-core- 3.1.0
Spring-jdbc- 3.1.2
J'ai oublié, tout en faisant de l'entité à l'origine. J'ai corrigé maintenant. Mais je suis sûr qu'aucun autre script ou une application accède à cette table. Donc, je veux savoir comment quelque chose comme cela pourrait se produire.
OriginalL'auteur gap_j | 2014-06-02
Vous devez vous connecter pour publier un commentaire.
Les gens confondent souvent la @Column(nullable) et @NotNull annotations.
La
@Column(nullable)
est destiné à l'généré scripts DDL. Mais vous n'avez pas utiliser Hibernate pour générer votre DDL, de sorte que vous ne devriez pas compter sur elle à tous les. Ce que vous voulez est@NotNull
qui est une validation d'exécution du déclencheur.Si vous définissez le Hibernate Validator Annotation (ou JPA 2.0) vous pouvez obtenir le DDL pour ceux aussi bien:
Et assurez-vous d'activer la validation si vous êtes en utilisant JPA Hibernate.
Certains paramètres sont déjà héritage et l'évolution des "vieux" paramètres peuvent casser de nombreux produits existants. C'est pourquoi vous avez plus de liberté avec les nouveaux (NotNull bean validation). La Colonne nullable réglage remonte à Hibernate origines tandis que le Haricot Validateur a trouvé sa voie après le Hibernate Validator projet à vu le jour et la JPA spécifications adopté cette fonctionnalité.
Mais le changement de comportement lors de l'exécution de la même procédure? Le processus en question n'a même pas été redémarré.
OriginalL'auteur Vlad Mihalcea