2009-10-30 5 views
2

Je rencontre beaucoup de difficultés à faire fonctionner mon fichier de mappage avec une collection d'éléments via une clé étrangère dans Hibernate. Java essaiera de charger ces fichiers ci-dessous et n'aura aucune exception d'exécution, mais la table des événements n'est jamais chargée en tant qu'objet d'un employé (elle restera nulle, mais tous les autres attributs seront chargés depuis la base de données). Dans ma base de données MySQL, je donne les résultats suivants:Aide pour le mappage des clés étrangères de la collection Hibernate

TABLE: Les employés

clé primaire: nom d'utilisateur varchar

Nom varchar

coderégion ENTIER

téléphone ENTIER

addressNumber ENTIER

addressLocation varchar

email varchar

TABLEAU: Événements

clé primaire: ID ENTIER

startDate DateTime

endDate DateTime

customerName varchar

em ployeeUsername varchar

<?xml version="1.0"?> 

<class name="Employee" table="Employees"> 
    <id name="username" column="username" type="string"/> 
    <many-to-one name="contact" class="Contact" column="username" unique="false" update="false" insert="false" optimistic-lock="true" not-found="exception" embed-xml="true" /> 
</class> 

<class name="Contact" table="Employees"> 
    <id name="username" column="username" type="string"/> 
    <property name="name" column="name" type="string"/> 
    <property name="addressNumber" column="addressNumber" type="int"/> 
    <property name="areacode" column="areacode" type="int"/> 
    <property name="phone" column="phone" type="int"/> 
    <property name="addressLocation" column="addressLocation" type="string"/> 
    <property name="email" column="email" type="string"/> 
</class> 

<?xml version="1.0"?> 

<class name="Event" table="Events"> 
    <id name="ID" column="ID" type="int"> 
     <generator class="assigned"/> 
    </id> 
    <property name="startDate" column="startDate" type="date"/> 
    <property name="endDate" column="endDate" type="date"/> 
    <property name="customerName" column="customerName" type="string"/> 
</class> 

<class name="Employee" table="Events" entity-name="Employee2"> 
    <id name="username" column="employeeUsername" type="string"/> 
    <list name="events" cascade="all"> 
     <key column="employeeUsername"/> 
     <list-index column="ID"/> 
     <one-to-many class="Event"/> 
    </list> 
</class> 

Assumer le fichier hibernate.cfg.xml existe et fonctionne (Si vous pensez que cela doit être montré, s'il vous plaît laissez-moi savoir). Il inclut les deux fichiers dans la partie de ses fichiers de mapping.

J'ai l'impression que mon erreur est probablement dans ma déclaration de la collection d'événements dans ma déclaration "list". Voici les classes Java:

package org.hibernate.employee; 

import java.util.Rendez-vous amoureux; Public class { private int ID; privé Date startDate; privé Date endDate; private String customerName;

public Event(){ 
    System.out.println("blah"); 
} 

/** 
* @return the iD 
*/ 
public int getID() { 
    return ID; 
} 
/** 
* @param id the iD to set 
*/ 
public void setID(int id) { 
    ID = id; 
} 
/** 
* @return the startDate 
*/ 
public Date getStartDate() { 
    return startDate; 
} 
/** 
* @param startDate the startDate to set 
*/ 
public void setStartDate(Date startDate) { 
    this.startDate = startDate; 
} 
/** 
* @return the endDate 
*/ 
public Date getEndDate() { 
    return endDate; 
} 
/** 
* @param endDate the endDate to set 
*/ 
public void setEndDate(Date endDate) { 
    this.endDate = endDate; 
} 
/** 
* @return the customerName 
*/ 
public String getCustomerName() { 
    return customerName; 
} 
/** 
* @param customerName the customerName to set 
*/ 
public void setCustomerName(String customerName) { 
    this.customerName = customerName; 
} 

}

/* 

* Fichier: Contact.java */

package org.hibernate.employee;

/** * Cette classe représente les coordonnées d'un employé. * */ public class Contact {

private int username; // the contact identifier in the database 
private int areacode; // the contact areacode 
private int phone; // the contact phone 
private String name; // the contact's name 
private int addressNumber; // the contact's address number 
private String addressLocation; // the contact's address location 
private String email; // the contact's email 

/** 
* Constructs a Contact object. 
*/ 
public Contact() { 

} 

/** 
* @return the areacode 
*/ 
public int getAreacode() { 
    return areacode; 
} 

/** 
* @param areacode the areacode to set 
*/ 
public void setAreacode(int areacode) { 
    this.areacode = areacode; 
} 

/** 
* @return the phone 
*/ 
public int getPhone() { 
    return phone; 
} 

/** 
* @param phone the phone to set 
*/ 
public void setPhone(int phone) { 
    this.phone = phone; 
} 

/** 
* @return the name 
*/ 
public String getName() { 
    return name; 
} 

/** 
* @param name the name to set 
*/ 
public void setName(String name) { 
    this.name = name; 
} 

/** 
* @return the addressNumber 
*/ 
public int getAddressNumber() { 
    return addressNumber; 
} 

/** 
* @param addressNumber the addressNumber to set 
*/ 
public void setAddressNumber(int addressNumber) { 
    this.addressNumber = addressNumber; 
} 

/** 
* @return the addressLocation 
*/ 
public String getAddressLocation() { 
    return addressLocation; 
} 

/** 
* @param addressLocation the addressLocation to set 
*/ 
public void setAddressLocation(String addressLocation) { 
    this.addressLocation = addressLocation; 
} 

/** 
* @return the email 
*/ 
public String getEmail() { 
    return email; 
} 

/** 
* @param email the email to set 
*/ 
public void setEmail(String email) { 
    this.email = email; 
} 

public String toString(){ 
    String retVal = ""; 
    retVal += "Address: " + this.addressNumber + " " + this.addressLocation + "\n"; 
    retVal += "Email: " + this.email + "\n"; 
    retVal += "Phone: " + this.areacode + " " + this.phone + "\n"; 
    retVal += "Name: " + this.name + "\n"; 
    return retVal; 
} 

public void setUsername(int username) { 
    this.username = username; 
} 

public int getUsername() { 
    return username; 
} 

}

/* 

* Fichier: Employee.java */

package org.hibernate.employee; import java.util.List;

/** * Cette classe représente un employé dans une base de données d'entreprise. * */ public class Employee {

private String username; // the employee's username 
private Contact contact; // the employee's contact information 
private List events; 

/** 
* Constructs an Employee object. 
*/ 
public Employee() { 
    super(); 
} 

/** 
* @return the username 
*/ 
public String getUsername() { 
    return username; 
} 

/** 
* @param username the username to set 
*/ 
public void setUsername(String username) { 
    this.username = username; 
} 

/** 
* @return the contact 
*/ 
public Contact getContact() { 
    return contact; 
} 

/** 
* @param contact the contact to set 
*/ 
public void setContact(Contact contact) { 
    this.contact = contact; 
} 

/** 
* @return the events 
*/ 
public List getEvents() { 
    return events; 
} 

/** 
* @param events the events to set 
*/ 
public void setEvents(List events) { 
    this.events = events; 
} 

public String toString(){ 
    String retVal = ""; 
    System.out.println(events); 
    retVal += "Username: " + username + "\n"; 
    retVal += "Contact: " + contact + "\n"; 
    return retVal; 
} 

}

Répondre

3

Vos applications sont mauvais pour deux raisons (principales):

  1. Cartographie des employés et de contact à la même table de cette façon ne va pas travailler. many-to-one nécessite une clé étrangère (par exemple une colonne séparée); vous essayez de réutiliser la clé primaire à la place.
  2. La réaffectation de la classe Employee à une table différente ne fonctionnera pas non plus - table et classe sont incompatibles. L'utilisation d'un nom d'entité différent empêche une erreur immédiate, mais ce n'est pas l'usage approprié.

Ce que vous devez faire à la place:

  1. Plan Contact comme component.
  2. Collecte d'événements directement sur Employee comme one-to-many association.

Quelque chose comme:

<class name="Employee" table="Employees"> 
    <id name="username" column="username" type="string"/> 

    <component name="Contact" class="Contact"> <!-- class attribute optional --> 
    <property name="name" column="name" type="string"/> 
    <property name="addressNumber" column="addressNumber" type="int"/> 
    <property name="areacode" column="areacode" type="int"/> 
    <property name="phone" column="phone" type="int"/> 
    <property name="addressLocation" column="addressLocation" type="string"/> 
    <property name="email" column="email" type="string"/> 
    </component> 
    <list name="events" cascade="all"> 
    <key column="employeeUsername"/> 
    <list-index column="event_idx"/> 
    <one-to-many class="Event"/> 
    </list> 
</class> 

Notez que list-index devrait vraiment être une colonne séparée dans votre table si vous voulez la carte liste des événements comme liste ordonnée; vous ne pouvez pas le mapper en identifiant. Si vous ne voulez pas le définir comme une colonne, vous pouvez soit mapper la liste en <bag> à la place (et, éventuellement, spécifier l'attribut order-by pour trier ce sac par) ou le mapper en tant que collection de composite elements où chaque événement ne sera plus une entité indépendante.Que cela s'applique ou non dépend des besoins de votre entreprise.

+0

Merci beaucoup pour votre aide. – jds2501

Questions connexes