JPA @OneToOne с общим идентификатором - могу ли я сделать это лучше?

Я работаю с существующей схемой, которую я не хотел бы изменять. Схема имеет взаимно однозначное отношение между таблицами 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

63
задан Manuel Drieschmanns 7 November 2017 в 13:24
поделиться