Impossible de rendre la relation @ManyToOne nullable
J'ai une many-to-one relation que je veux être nullable:
@ManyToOne(optional = true)
@JoinColumn(name = "customer_id", nullable = true)
private Customer customer;
Malheureusement, JPA conserve le réglage de la colonne dans ma base de données comme not NULL. Quelqu'un peut-il expliquer cela? Est-il un moyen de le faire fonctionner? Notez que j'utilise JBoss 7, JPA 2.0 avec mise en veille prolongée en tant que fournisseur de persistance et d'une base de données PostgreSQL 9.1.
MODIFIER:
J'ai trouvé la cause de mon problème. Apparemment, c'est dû à la façon dont je définis la clé primaire de l'entité référencée Customer
:
@Entity
@Table
public class Customer {
@Id
@GeneratedValue
@Column(columnDefinition="serial")
private int id;
}
Il semble que l'utilisation de @Column(columnDefinition="serial")
pour la clé primaire définit automatiquement la clé étrangère faisant référence à NOT NULL
dans la base de données. Est-ce vraiment le comportement attendu lors de la spécification du type de colonne comme serial
? Est-il une solution pour permettre nullable clés étrangères dans ce cas?
Vous en remercie d'avance.
source d'informationauteur vcattin
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la solution à mon problème. La façon dont la clé primaire est définie au sein de l'entité
Customer
est très bien, le problème réside dans la clé étrangère de la déclaration. Elle doit être déclarée comme ceci:En effet, si l'attribut
columnDefinition="integer"
est omis, les clés étrangères, par défaut, être définie comme la colonne source: un non-nulle de la série avec sa propre suite. Cela n'est évidemment pas ce que nous voulons comme nous voulons juste la pour faire référence à l'auto-incrémenté ID, pas pour en créer un nouveau.En outre, il semble que l'attribut
name=customer_id
est également nécessaire comme je l'ai observé lors de l'exécution de certains tests. Sinon, la colonne de la clé étrangère est toujours être défini comme la colonne source. C'est un comportement étrange, à mon avis. Des commentaires ou des informations supplémentaires pour clarifier ce sont les bienvenus!Enfin, l'avantage de cette solution est que l'ID est généré par la base de données (non pas par la JPA) et donc nous n'avez pas à vous inquiéter à ce sujet lors de l'insertion de données manuellement ou via des scripts qui arrive souvent dans la migration des données ou de la maintenance.
Je suis tombé sur ce problème, mais j'ai été en mesure de le résoudre de cette façon:
Peut-être que le problème a surgi à partir de déclarer
@ManyToOne(optional = true)
Qui est très bizarre.
En JPA nullable paramètre est à true par défaut. J'utilise ce type de configuration de tous les temps et il fonctionne très bien. Si vous essayez d'enregistrer l'entité, il doit être réussie.
Avez-vous essayé de supprimer la table qui est créé pour cette relation? Peut-être que vous avez hérité de la table avec cette colonne?
Ou peut-être vous devriez essayer de trouver la solution sur d'autres morceaux de code, parce que c'est la bonne configuration.
Note: j'ai essayé cette configuration PostgreSQL JPA2 et Hibernate.
MODIFIER
Dans ce cas, peut-être vous pouvez essayer un peu différent de la définition de la clé primaire.
Par exemple, vous pouvez utiliser la définition comme ceci:
et postgresql va générer
Si c'est assez bon, vous pouvez essayer cette solution.