Лучший дизайн для одного родителя нескольких детей в jpa - PullRequest
0 голосов
/ 12 января 2020

Я создаю проект, который имеет ниже jpa сущностей (Таблицы)

  1. Пользователь (userId в качестве первичного ключа)
  2. UserPersonalDetails (userId - первичный / внешний ключ, сопоставленный с userID в Таблица пользователя)
  3. UserAcadmicsDetails (userId - первичный / внешний ключ, сопоставленный с userID в таблице User)
  4. UserPerformace (userId - первичный / внешний ключ, сопоставленный с userID в таблице User)

. , , и так далее

Я смущен, чтобы выбрать лучший дизайн / подход здесь, т.е. двунаправленный OneToOne или однонаправленный OneToOne ??

Мой первый хотя однонаправленный OneToOne, так как объект User интенсивно используется в приложении ( Операция, такая как вход в систему), следовательно, я не хочу извлекать другие объекты при получении объекта пользователя.

Ниже приведен код моей сущности

ПОЛЬЗОВАТЕЛЬ:

    public class User implements UserDetails {
      @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        Long userId;

        @Column(nullable = false)
        String firstName;

        @Column(nullable = false)
        String lastName;


        @Column(nullable = false,unique=true)
        String email;
// getter setters
}

UserPersonalDetails

@Entity
@Table
public class UserPersonalDetails {

    @Id
    Long userId;


    @PrimaryKeyJoinColumn 
    @OneToOne(cascade = CascadeType.ALL)
    @OnDelete(action = OnDeleteAction.CASCADE)
    @MapsId
    User user;

    Long univercityId;
    Long collageId;
    String address;
    String parentContact;
    String tempAddress;

// getter setters
}

Но при таком подходе, когда я пытаюсь удалить пользователя, он терпит неудачу, поскольку в других таблицах содержится внешний ключ.

Кто-нибудь может предложить идеальный дизайн здесь?

1 Ответ

0 голосов
/ 13 января 2020

Так что в качестве одного из вариантов, если возможно, иметь одну таблицу. Рассмотрим случай с типом значения вместо сущности. Так что вам не нужно беспокоиться о жизненном цикле UserPersonalDetails. Срок его службы привязан к конкретному пользовательскому экземпляру.

   @Entity
   public class User implements UserDetails {
       @Id
       @GeneratedValue(strategy = GenerationType.AUTO)
       Long userId;

       @Column(nullable = false)
       String firstName;

       @Column(nullable = false)
       String lastName;

       @Column(nullable = false,unique=true)
       String email;

       UserPersonalDetails userDetails;

       public UserPersonalDetails getUserDetails() { 
           return userDetails;
       }

       public void setUserDetails() { 
           this.userDetails = userDetails;
       }

            // other getter setters
    }


    @Embeddable
    public class UserPersonalDetails {

        @Column(nullable = false)  // would be nested embeddable component
        Long univercityId;

        @Column(nullable = false) // would be nested embeddable component
        Long collageId;

        @Column(nullable = false)
        String address;

        @Column(nullable = false)
        String parentContact;

        @Column(nullable = false)
        String tempAddress;

    // getter setters
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...