Я не вижу никакого использования cascade = CaseCadeType.DETACH
, вместо этого вы можете использовать cascade = CaseCadeType.ALL
, и вы можете удалить insertable = false, updatable = false
вместо orphanRemoval = false
, и по умолчанию это false.
Таким образом, можно иметь Person без SocialId, в этом случае ваш socialId будет иметь значение NULL, и вы можете присоединить его позже (я полагаю, вы хотите, чтобы social_id был FK в Person, а не person_id в объекте / таблице SocialId)
Таким образом, ваш измененный код будет таким, как показано ниже
@Entity
@Table(name = "PERSON")
class Person {
@Id
private Long id;
@Column(name = "NAME");
private String name;
@OneToOne(fetch = FetchType.LAZY, orphanRemoval = false, mappedBy = "person")
private SocialId socialId;
}
@Entity
@Table(name = "SOCIAL_ID")
class SocialId {
@Id
private Long id;
@Column(name = "NAME");
private String name;
@OneToOne
@JoinColumn(name = "PERSON_ID", foreignKey = @ForeignKey(name = "FK_PERSON_ID"))
private Person person;
}
Ваш DaoMethod, вам не нужно сохранять оба по отдельности, так как они сопоставлены друг с другом. Если вы сохраните установленный социальный идентификатор для Персона и сохранит Персона, Socialid будет автоматически сохранен JPA.
@Transactional
public void customSave(Person person) {
SocailId socialId = person.getSocialId();
// Person Save
personrepo.save(person);
socialId.setPersonId(person.getId());
// SocailId Save
socialIdRepo.save(socialId);
}