Я работаю с существующей схемой, которую я не хотел бы изменять. Схема имеет взаимно однозначное отношение между таблицами Person и VitalStats, где Person имеет первичный ключ, а VitalStats использует то же поле, что и его первичный ключ, и его внешний ключ для Person, что означает, что его значение является значением соответствующего PK. of Person.
Эти записи создаются внешними процессами, и мой код JPA никогда не нуждается в обновлении VitalStats. Для моей объектной модели я бы хотел, чтобы мой класс Person содержал член VitalStats, НО:
Когда я пробую
@Entity
public class Person{
private long id;
@Id
public long getId(){ return id; }
private VitalStats vs;
@OneToOne(mappedBy = “person”)
public VitalStats getVs() { return vs; }
}
@Entity
public class VitalStats{
private Person person;
@OneToOne
public Person getPerson() { return person; }
}
, у меня возникает проблема, заключающаяся в том, что VitalStats не имеет @Id, что не работает для @Entity. \
Если я попробую
@Id @OneToOne
public Person getPerson() { return person; }
, это решит проблему @Id, но потребует, чтобы Person был Serializable. Мы еще вернемся к этому.
Я мог бы создать VitalStats @Embeddable и подключить его к Person через @ElementCollection, но тогда к нему нужно будет обращаться как к коллекции, даже если я знаю, что там только один элемент. Выполнимо, но и немного раздражает, и немного сбивает с толку.
Так что же мешает мне просто сказать, что Person реализует Serializable? На самом деле ничего, кроме того, что мне нравится, что все в моем коде есть по какой-то причине, и я не вижу в этом никакой логики, что делает мой код менее читаемым.
Тем временем я просто заменил поле Person в VitalStats с длинным идентификатором personId и @Id этого VitalStats, так что теперь работает @OneToOne.
Все эти решения того, что кажется (мне) простой проблемой, немного неуклюжи, так что мне интересно, могу ли я m чего-то не хватает, или может ли кто-нибудь хотя бы объяснить мне, почему Person должен быть Serializable.
TIA