2010-02-20 7 views
0

J'ai deux tables dans la base de données mssql des clients. La première est une table de travail - j'ai donc créé une entité de travail qui contient le type de charge et le poids de la charge, et tout cela fonctionne bien.Hibernate MS SQL Join issue

Mon problème maintenant est qu'il y a une deuxième table qui inclut des informations sur le point de chargement et de déchargement. La deuxième table, que j'appelle JEP, a une clé primaire composée de plusieurs éléments: le type (charger ou décharger), le code postal et le numéro de client.

J'ai créé une entité JobEndPoint et NetBeans a également créé un objet représentant la clé primaire JobEndPointPK contenant tous ces champs.

Je souhaite ajouter deux JobEndPoint (loadPoint et unloadPoint) à mon entité Job. Mon problème est maintenant: comment puis-je annoter cela dans Hibernate? À mon avis, il s'agit d'un navire de relation @OneToOne. Il serait parfait si je pouvais spécifier une instruction SELECT comme SELECT * FROM JEP WHERE type="load" AND customer_nr="123" AND zip_code="123 ... ". Est-ce possible avec Hibernate?

Merci pour votre aide!

Regeards,

Marco


Voici les entités:

@Entity 
@Table(name = "Auftragsdaten", catalog = "...", schema = "dbo") 
public class Job implements Comparable<Object>, Serializable { 

    private static final long serialVersionUID = 4285871251915951149L; 

    @Id 
    @Basic(optional = false) 
    @Column(name = "`id`", nullable = false) 
    int id; 

    @Column(name = "`AufNr`", nullable=false) 
    int jobId; 

    @Transient 
    List<Integer> jobsAdded; 

    @Column(name = "`Beladedatum`", nullable=false) 
    @Temporal(TemporalType.DATE) 
    Date loadDate; 

    @Column(name = "`Beladezeit`") 
    @Temporal(TemporalType.TIME) 
    Date loadTimeFrom; 

    @Transient 
    Date loadTimeTo; 

    @Column(name = "`Entladedatum`", nullable=false) 
    @Temporal(TemporalType.DATE) 
    Date unloadDate; 

    @Column(name = "`Entladezeit Beginn`") 
    @Temporal(TemporalType.TIME) 
    Date unloadTimeFrom; 

    @Column(name = "`Entladezeit Ende`") 
    @Temporal(TemporalType.TIME) 
    Date unloadTimeTo; 

    @Transient 
    List<JobEndPoint> froms; 

    @OneToOne 
    @JoinColumns ({ 
     @JoinColumn(name="`Beladetyp`", referencedColumnName = "`Ladetyp`", insertable = false, updatable = false), 
     @JoinColumn(name="`AbsNr`", referencedColumnName = "`KundenNr`", insertable = false, updatable = false), 
     @JoinColumn(name="`Verkehrsart`", referencedColumnName = "`VerkArt`", insertable = false, updatable = false), 
     @JoinColumn(name="`von LKZ`", referencedColumnName = "`LKZ`", insertable = false, updatable = false), 
     @JoinColumn(name="`von PLZ`", referencedColumnName = "`PLZ`", insertable = false, updatable = false) 
    }) 
    JobEndPoint fromPoint; 

    @Transient 
    JobEndPoint toPoint; 

    @Column(name = "`Verkehrsart`", length = 10, nullable=false) 
    @Enumerated 
    JobType type; 

    @Column(name = "`Anzahl Paletten CCG1`") 
    int numberCCG1; 

    @Column(name = "`Anzahl Paletten CCG2`") 
    int numberCCG2; 

    @Transient 
    int numberFullContainer; 

    @Transient 
    int numberEmptyContainer; 

    @Column(name = "`Anzahl Container`") 
    int numberContainer; 

    @Column(name = "`Anz Stellplätze`") 
    int numberUnits; 

    @Column(name = "`Bruttogewicht`", nullable=false) 
    int loadWeight; 

    @ManyToOne 
    @JoinColumn(name="`Kühlkennzeichen`") 
    CoolingCode coolingCode; 
} 

@Entity 
@Table(name = "BES", catalog = "...", schema = "dbo") 
public class JobEndPoint implements Serializable { 

    private static final long serialVersionUID = 1017986852824783744L; 

    @Id 
    protected JobEndPointPK jobEndPointPK; 

    (...) 
} 

@Embeddable 
public class JobEndPointPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name = "`Ladetyp`", nullable = false, length = 50) 
    @Enumerated 
    EndPointType type; 

    @Basic(optional = false) 
    @Column(name = "`KundenNr`", nullable = false) 
    int customerId; 

    @Basic(optional = false) 
    @Column(name = "`VerkArt`", nullable = false, length = 10) 
    @Enumerated 
    JobType jobType; 

    @Basic(optional = false) 
    @Column(name = "`LKZ`", nullable = false, length = 3) 
    String countryCode; 

    @Basic(optional = false) 
    @Column(name = "`PLZ`", nullable = false, length = 7) 
    String zipCode; 
} 

Répondre

1

En général, Je recommande d'utiliser une clé primaire interne générée au lieu de la clé composite. Cependant, si vous avez besoin de coller votre clé composite, voici quelques idées qui, espérons-le, vous aideront.

Je comprends que JobEndPointPK est implémenté en tant que composant identificateur (voir la référence Hibernate, chapter 8.4). Note: il est essentiel qu'il implémente correctement les méthodes equals et hashCode`, car Hibernate s'en sert.

Mise à jour: à condition que votre JobEndPoint et JobEndPointPK ressemble à quelque chose comme ceci:

@Embeddable 
class JobEndPointPK { 
    @Column(name = "type", nullable = false) 
    @Enumerated 
    EndPointType type; 

    @Column(name = "zipCode", nullable = false) 
    String zipCode; 

    @Column(name = "customerNumber", nullable = false) 
    int customerId; 

    // equals, hasCode, getters, setters etc. 
} 

@Entity 
class JobEndPoint { 
    @Id 
    private JobEndPointPK key; 

    // getters, setters etc. 
} 

L'annotation de cartographie serait quelque chose comme:

@Entity 
class Job { 
    @OneToOne 
    @JoinColumns ({ 
     @JoinColumn(name="loadPointType", referencedColumnName = "type"), 
     @JoinColumn(name="loadPointZip", referencedColumnName = "zipCode"), 
     @JoinColumn(name="loadPointCust", referencedColumnName = "customerNumber") 
    }) 
    private JobEndPoint loadPoint; 
    // similarly for unloadPoint 
    // other properties 
} 

L'exemple est adapté de here.

Je ne sais pas comment faire face à JobEndPointPK.type si, comme pour loadPoint il est évidemment Load et unloadPoint, Unload, de sorte que vous très probablement ne voulez pas séparément stocker dans la base de données. Mon truc est que vous pouvez spécifier la valeur avec l'annotation @Formula, mais je n'ai vu aucun exemple concret pour cela.

Notez que tout ce code est purement expérimental, je ne l'ai pas testé.

Il existe d'autres variantes sur le thème. Pour plus de détails, voir la section "Clés composites avec annotations" au Chapter 8 of Java Persistence with Hibernate.

+0

Merci! Cela ressemble à un début. Est-il correct que j'ai le JobEndPointPK dans l'objet Tâche bien que je veux l'objet JobEndPoint? Ou dans l'autre sens: comment obtenir l'objet JobEndPoint avec JobEndPointPK stocké dans le Job lors de l'exécution? –

+0

@Marco Damn, je l'ai foiré :-(Maintenant j'ai mis à jour le code.J'ai également lié un meilleur exemple –

+0

@Marco Rien d'évident ... pourriez-vous poster votre dernier code? –