Hibernate композитный foregin ключ с XDoclet
Использование Hibernate 3.2.7ga и XDoclet 2.0.6 (плагин Hibernate 1.0.4).
У меня есть следующие таблицы:
Сотрудник -> Pk (idemployee)
Оценка -> Pk (idemployee,valuationdate) / Fk (idmeployee ссылается на Employee.idemployee)
Я сделал следующие POJOS:
Работник
/**
* @hibernate.class table="EMPLOYEES" lazy="false"
* @hibernate.cache usage="read-write"
*
*/
public class Employee {
private int _idEmployee;
private Set _employeeEvaluations;
/**
* @return Returns the idEmpleado.
* @hibernate.id generator-class="native" unsaved-value="0"
* @hibernate.generator-param name="sequence" value="idsequence"
*/
public int getIdEmployee(){
return _idEmployee;
}
/**
* @param idEmpleado The idEmpleado to set.
*/
public void setIdEmployee(int idEmpleado){
_idEmployee = idEmpleado;
}
/**
* @hibernate.set inverse="true" lazy="true" cascade="all" fetch="select"
* @hibernate.one-to-many class="ilog.rostering.model.Evaluation"
* @hibernate.key column="IDEMPLOYEE"
*/
public Set getEmployeeEvaluations() {
if (_employeeEvaluations == null)
_employeeEvaluations = new HashSet();
return _employeeEvaluations;
}
private void setEmployeeEvaluations(Set employeeEvaluations) {
_employeeEvaluations = employeeEvaluations;
}
}
оценка
/**
*
* @hibernate.class table="EMPEVALUATIONS" lazy="true"
* @hibernate.cache usage="read-write"
*
*
*/
public class Evaluation {
private EvaluationPK _pk;
private String _evaluation;
public Evaluation(EvaluationPK pk, String evaluation) {
setPk(pk);
setEvaluation(evaluation);
}
public static class EvaluationPK implements Serializable{
private Employee _employee;
private Date _evaluationDate;
public EvaluationPK() {
}
/**
* @hibernate.key-property
* @hibernate.many-to-one class="ilog.rostering.model.Employee" column="IDEMPLOYEE" not-null="true"
*/
public Employee getEmployee(){
return _employee;
}
/**
* @hibernate.key-property
*/
public Date getEvaluationDate(){
return _evaluationDate;
}
public void setEmployee(Employee emp){
_employee=emp;
}
public void setEvaluationDate(Date date){
_evaluationDate=date;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj){
EvaluationPK pk = (EvaluationPK)obj;
return pk.getEmployee().getIdEmployee()== getEmployee().getIdEmployee() && pk.getEvaluationDate().equals( getEvaluationDate() ) ;
}
/**
* @see java.lang.Object#hashCode()
*/
public int hashCode(){
return getEvaluationDate().hashCode() + getEmployee().getIdEmployee();
}
}
/**
* @hibernate.composite-id
* @return the EvaluationPK
*/
public EvaluationPK getPk(){
return _pk;
}
/**
* @param pk the pk to set
*/
public void setPk(EvaluationPK pk){
_pk = pk;
}
/**
* @hibernate.property column="EVALUATION"
*/
public String getEvaluation() {
return _evaluation;
}
public void setEvaluation(String evaluation) {
this._evaluation = evaluation;
}
}
Когда приложение восстанавливает оценки сотрудника, я получаю ошибку, потому что выбор, который оно пытается выполнить, следующий:
select
employeeev0_.IDEMPLOYEE as IDEMPLOYEE1_,
employeeev0_.employee as employee1_,
employeeev0_.evaluationDate as evaluati2_1_,
employeeev0_.employee as employee23_0_,
employeeev0_.evaluationDate as evaluati2_23_0_,
employeeev0_.EVALUATION as EVALUATION23_0_,
from EMPEVALUATIONS employeeev0_ where employeeev0_.IDEMPLOYEE=?
Я также попытался оставить только поле int _idemployee в классе PK и добавить следующее поле в Evaluation:
Employee _employee;
/**
*
* @hibernate.many-to-one class="ilog.rostering.model.Employee" column="IDEMPLOYEE" not-null="false"
*
* @return Returns the employee
*/
public Employee getEmployee() {
return _employee;
}
Этот метод дал мне другую ошибку: при попытке сделать коммит произошел сбой, потому что вставка, которую он пытался выполнить, была:
insert into EMPEVALUATIONS (IDEMPLOYEE, EVALUATION, idEmployee, evaluationDate) values (?, ?, ?, ?)
Я чувствую, что приближаюсь к решению, но за всю свою жизнь не могу найти ни одного примера с такими тегами!
Большое спасибо всем заранее