Проблема с пониманием отображения в Java Spring boot - PullRequest
0 голосов
/ 06 августа 2020

Я только начал с загрузки Spring. У меня есть 3 таблицы User, UserNotes и Notes.

  1. User (userID, EmailID)
  2. UserNotes (UserID, NotesID)
  3. Notes (notesID, Title, Сообщение)

Когда я добавляю электронное письмо, UserID должен генерироваться автоматически. И когда я добавляю какую-либо заметку, соответствующую пользователю, идентификатор Notes в таблице UserNotes должен быть автоматически сгенерирован и добавлен в таблицу Notes . Я сделал это в MySQL, сделав userID в таблице User первичным ключом, а UserID в UserNotes - как ссылающийся на него внешний ключ. Аналогично NotesID в UserNotes в качестве первичного ключа и notesID в Notes таблице в качестве внешнего ключа для этого.

Все работает нормально, когда я использую запросы MySQL для этот. Но теперь я хочу использовать для этого Spring Data JPA. Но я столкнулся с трудностями в понимании того, как сопоставить эти отношения с несколькими таблицами. Я пробовал OneToMany и ManyToOne , но это не сработало

MySQL Queries for the reference  
1) Create table User(userID int AUTO_INCREMENT, emailID varchar(40), PRIMARY KEY(userID));  
2) Create table UserNotes(userID int, NotesID int AUTO_INCREMENT, PRIMARY KEY(NotesID), Foreign key(UserID) references User(UserID) on DELETE CASCADE);  
3) Create table Notes(notesID int, title varchar(100), message varchar(500), Date date, PRIMARY KEY(notesID), FOREIGN KEY(notesID) references UserNotes(NotesID) on DELETE CASCADE);  

1 Ответ

0 голосов
/ 06 августа 2020

Непроверенный пример с использованием Hibernate, JPA, Lombok:

Пользовательский объект

@Entity
@Table(name = "USER")
@SequenceGenerator(name = "userSeqId", sequenceName = "user_seq_id", allocationSize = 1)
@NoArgsConstructor
@Setter
@Getter
public class User {

    @Id
    @GeneratedValue(generator = "userSeqId", strategy = GenerationType.AUTO)
    private Long id;

    @NotBlank
    @Column(name = "EMAIL", unique = true)
    private String email;
}

Примечания

@Entity
@Table(name = "NOTES")
@SequenceGenerator(name = "notesSeqId", sequenceName = "notes_seq_id", allocationSize = 1)
@NoArgsConstructor
@Setter
@Getter
public class Notes {

    @Id
    @GeneratedValue(generator = "notesSeqId", strategy = GenerationType.AUTO)
    private Long id;

    @NotBlank
    @Column(name = "TITLE")
    private String title;

    @NotBlank
    @Column(name = "MESSAGE")
    private String message;
}

UserNotes entity

@Entity
@Table(name = "USER_NOTES")
@NoArgsConstructor
@Setter
@Getter
public class UserNotes {

    @EmbeddedId
    private UserNotesKey id;

    @NotNull
    @ManyToOne
    @MapsId("USER_ID")
    @JoinColumn(name = "USER_ID")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private User user;

    @NotNull
    @ManyToOne(cascade = CascadeType.PERSIST)
    @MapsId("NOTES_ID")
    @JoinColumn(name = "NOTES_ID")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Notes notes;
}

@Embeddable
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@EqualsAndHashCode
public class UserNotesKey implements Serializable {

    @Column(name = "USER_ID")
    private Long userId;

    @Column(name = "NOTES_ID")
    private Long notesId;
}

Repositories

public interface UserRepository extends JpaRepository<User, Long> {

}

public interface NotesRepository extends JpaRepository<Notes, Long> {

}

public interface UserNotesRepository extends JpaRepository<UserNotes, UserNotesKey> {

    List<UserNotes> findByUser(User user);
}

Тестовая служба

@Service
@Transactional
@RequiredArgsConstructor
public class TestService {

    private final UserRepository userRepository;
    private final UserNotesRepository userNotesRepository;

    public User saveUser(User user) {
        User newUser = new User();
        user.setEmail(user.getEmail());
        return userRepository.save(user);
    }

    public UserNotes saveNotes(User user, Notes notes) {
        UserNotes userNotes = new UserNotes();
        userNotes.setUser(user);
        userNotes.setNotes(notes);
        return userNotesRepository.save(userNotes);
    }

    public List<Notes> getNotes(User user) {
        return userNotesRepository.findByUser(user)
                .stream()
                .map(UserNotes::getNotes)
                .collect(Collectors.toList());
    }
}
...