Я пытаюсь оценить отображение в этом документе Hibernate:
раздел 2.2.3.1. Генерация идентификатора свойства
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier
В документе Person и MedicalHistory имеет отображение @OneToOne (MedicalHistory указывает на Person), и документ предлагает две стратегии отображения:
Первая стратегия:
@Entity
class MedicalHistory implements Serializable {
@Id @OneToOne
@JoinColumn(name = "person_id")
Person patient;
}
@Entity
public class Person implements Serializable {
@Id @GeneratedValue Integer id;
}
Вторая стратегия:
@Entity
class MedicalHistory implements Serializable {
@Id Integer id;
@MapsId @OneToOne
@JoinColumn(name = "patient_id")
Person patient;
}
@Entity
class Person {
@Id @GeneratedValue Integer id;
}
Теперь все работает нормально, но ...
Чтобы усложнить ситуацию, я добавляю еще одну (3-ю) таблицу (класс), которая имеет отношение @ManyToOne к MedicalHistory. И первая стратегия потерпит неудачу (пока 2-я стратегия все еще работает).
Я создаю еще один (третий) класс с именем MedicalLog, который имеет отношение @ManyToOne к MedicalHistory:
@Entity
public class MedicalLog implements Serializable
{
@Id @GeneratedValue
private int id;
@ManyToOne
@JoinColumn(name="MedicalHistory_id")
private MedicalHistory medicalHistory;
private String action;
private Timestamp time;
public MedicalLog(MedicalHistory mh , String action)
{
this.medicalHistory = mh;
this.action = action;
}
// other methods
}
Исключение возникает при инициализации hibernate ...:
Caused by: org.hibernate.AnnotationException: A Foreign key refering destiny.play.MedicalHistory from destiny.play.MedicalLog has the wrong number of column. should be 0
at org.hibernate.cfg.annotations.TableBinder.bindFk(TableBinder.java:421)
at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:111)
Лично я люблю стратегию 1 больше, потому что она не вводит другую переменную Integer id . И я чувствую, что Object id (стратегия 2) более удобен (стиль OO).
В любом случае, хотя стратегия 2 работает, но мне интересно, есть ли способ заставить стратегию 1 также работать?
Большое спасибо!
- обновлено: создание таблицы -
Создание таблицы (MySQL):
CREATE TABLE IF NOT EXISTS `Person` (
`id` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `MedicalHistory` (
`patient_id` int(10) NOT NULL,
PRIMARY KEY (`patient_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `MedicalLog` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`MedicalHistory_id` int(10) NOT NULL,
`action` varchar(15) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Надеюсь, это поможет