2010-07-07 2 views
1

Je cherche un moyen de définir le mappage "par défaut" qu'Hibernate applique à un nom de variable dans un objet Java pour l'interroger par rapport à la base de données. Pour le moment, nous utilisons le balisage inline javax.persistence pour définir manuellement les noms de colonnes, mais comme nous avons une politique de nommage rigide pour notre base de données, il serait bien de sauter le nom manuel et de laisser Hibernate faire le mapping. Cependant, pour le moment, cela ne marche pas du tout, sauf pour les champs clés locaux non-primaires. Pour l'instant, Hibernate semble être configuré pour mapper des clés non-étrangères juste à leur nom (voir "foo" dans la classe d'exemple ci-dessous), et des clés étrangères à "variableName_ReferencedTable_Id" (voir "bar" dans le ci-dessous exemple de classe). Nous souhaitons que les clés non étrangères restent telles quelles, excepté pour la variable marquée @id, que nous aimerions associer à "TableName_Id", et nous aimerions que les clés étrangères soient mappées sur "variableName_Id". Est-ce même possible, ou devons-nous simplement faire face à une cartographie manuelle?Est-il possible de définir le mappage de nom de variable "par défaut" de Hibernate?

package testPackage.test 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.ManyToOne; 

@Entity 
public class Table1 { 

    private int id; 
    private int localVariable; 
    private int foreignKeyVariable; 

    // Constructor here somewhere 

    // Without a @Column(name="Table1_Id"), this comes out as "id". 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    // This works fine, being a local field. 

    public int getLocalVariable() { 
     return localVariable; 
    } 

    public void setLocalVariable(int LocalVariable) { 
     this.localVariable = localVariable; 
    } 

    // Withou a @JoinColumn(name="foreignKeyVariable_Id") , this comes out as "foreignKeyVariable_Table2_Id". 

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn() // Not sure if this would even be necessary at all. Happy to leave it out if possible. 
    public int getForeignKeyVariable() { 
     return foreignKeyVariable; 
    } 

    public void setForeignKeyVariable(int foreignKeyVariable) { 
     this.foreignKeyVariable = foreignKeyVariable; 
    } 

} 
+2

Hibernate a le concept de 'NamingStrategy', mais il n'est pas sensible à savoir si l'objet est un PK ou une colonne normale, donc cela ne va pas être utile. – skaffman

+0

Merci pour l'idée 'NamingStrategy' - réussi à implémenter les conventions de clé étrangère en utilisant cela. Toujours aux prises avec la clé primaire malheureusement, puisque si vous n'incluez pas une annotation '@column (name = foo)', columnName' dans l'ensemble 'NamingStrategy' n'est jamais appelé. Dommage, je m'attendais à ce que Hibernate suppose implicitement que toute variable non marquée comme @ Transient et non marquée soit @ Column et qu'elle soit elle-même '@Column (name = VarName)' lorsqu'elle est exécutée. .. – Stephen

+0

Skaffman; Considérant que personne d'autre n'est venu pour résoudre ce problème, si vous voulez écrire votre commentaire comme une réponse, je serais heureux de vous donner une coche verte - NamingStrategy a résolu la moitié du problème, au moins. – Stephen

Répondre

1

(copié de commentaire)

Hibernate a le concept de NamingStrategy, mais ce n'est pas sensibles au fait que que l'objet est un PK ou une colonne normale, de sorte que cela ne va pas être d'aucune utilité.

Questions connexes