Отображение OneToOne с каскадом = CascadeType.DETACH - PullRequest
0 голосов
/ 04 мая 2020
       class Person { 
        @Id
        private  Long id;

        @Column(name = "NAME");
        private String name;

        @OneToOne(mappedBy="person", cascade = CaseCadeType.DETACH)
        private SocialId socialId;

    }



     class SocialId {
        @Id
        private  Long id;
        @Column(name = "NAME");
        private String name;

        @Column(name ="PERSON_ID")
        private Long personId;

        @OneToOne(cascade = CaseCadeType.DETACH)
        @JoinColumn(name = "PERSON_ID", referencedColumnName = "id", insertable = false, updatable = false)
        private Person person;
    }

   @Transactional
   public void customSave(Person person) {
     SocailId socialId = person.getSocialId();
     // Person Save
     personrepo.save(person);
     socialId.setPersonId(person.getId());     
     // SocailId Save
     socialIdRepo.save(socialId);    
   }

У меня выше дело, будет ли оно работать. Пожалуйста, не думайте ничего, только для цели я создал две сущности.

Мой вопрос 1. Я объявил @Transactional для customSave, что произойдет после этого.

Если мне нужно, чтобы это работало, какую настройку мне нужно сделать.

PS: я исправил проблему. Я хотел бы знать, что все неправильно в приведенных выше декларациях правильно. Если это правильно, то как и почему.

1 Ответ

1 голос
/ 05 мая 2020

Я не вижу никакого использования 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);    
   }
...