7
votes

Hibernez une clé étrangère plusieurs à une fois par défaut 0

J'ai une table dans laquelle l'objet parent a une relation de plusieurs-un en option. Le problème est que la table est configurée sur la colonne FOEKE par défaut sur 0.

Lorsque vous sélectionnez, à l'aide de FETCH = "JOIN", etc - La valeur par défaut de 0 sur le fêche est utilisée pour essayer de plus en plus une autre table pour l'ID 0. Bien sûr, cela n'existe pas, mais comment puis-je dire à Hibernate de traiter une valeur de 0 pour être identique à NULL-- pour ne pas parcourir plus de 20 fois dans la recherche d'une relation qui ne vit pas Existe? xxx


1 commentaires

Pourquoi la valeur par défaut 0 et ne pas NULL? De plus, un FK doit être nul ou un ID valide dans la table cible. Cette colonne a-t-elle en fait une construction FK?


3 Réponses :


0
votes

Je pense que vous utilisez du type primitif comme colonnes de clé principale / étrangère de votre objet. Si oui, essayez d'utiliser des cours d'emballage. Parce que les types primitifs ne peuvent pas avoir de valeurs par défaut comme NULL.


0 commentaires

6
votes

Il y a deux façons de faire cela, la façon qui peut devenir laid de la performance laid et la façon qui est douloureuse et gênante.

La manière potentiellement laid est faite sur la fin de toile. Utilisation des annotations hibernées, ce serait: xxx

Malheureusement, cela oblige une base de données préventive (pas de chargement paresseux) car le périphérique peut être null, et si hibernate a créé un appareil paresseux alors " Device == null "ne serait jamais vrai.

L'autre manière implique la création d'un USERType personnalisé qui intercepte des demandes pour l'ID 0 et le renvoie null pour eux, puis l'affectant à la clé primaire de Dispositif avec @type. Cela oblige l'interprétation 0 ~ nulle sur tout le monde avec une clé étrangère dans un appareil.


0 commentaires

3
votes

J'ai pu résoudre ce problème en créant un type ID-Long qui étend le type long intégré, mais si l'ID renvoyé de SQL était 0, renvoyez NULL à la place. Cela a gardé l'allocation de la valeur par défaut dans notre dB tout en obtenant de l'hibernation pour arrêter de faire des extraçons paresseux.

public class IdentifierLongType extends LongType implements IdentifierType {

@Override
public Object get(ResultSet rs, String name) throws SQLException {
    long i = rs.getLong(name);
    if (i == 0) {
        return null;
    } else {
        return Long.valueOf(i);
    }
}


0 commentaires