java - 在 Java Spring boot 中理解映射的问题
问题描述
我刚刚开始使用 Spring Boot。我有 3 个表 User、UserNotes 和 Notes。
- 用户(用户 ID、电子邮件 ID)
- 用户注释(用户 ID、注释 ID)
- 注释(notesID、标题、消息)
当我添加电子邮件时,必须自动生成 UserID。当我添加与用户对应的任何注释时,必须自动生成UserNotes表中的 Notes Id,并且必须将其添加到Notes表中。
我在 MySQL 中通过将User表中的 userID 作为主键并将 UserNotes 中的 UserID 作为引用它的外键来完成它。类似地,UserNotes中的 NotesID作为主键,Notes表中的 notesID 作为外键。
当我为此使用 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);
解决方案
使用 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
@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;
}
存储库
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());
}
}
推荐阅读
- spring-boot - 我可以为 oauth2 登录过程设置两个 redirect_uri 吗?
- javascript - Chart.js 3.4/Vue3 如何隐藏边框刻度并设置特定数量的网格线
- json - 使用 WSO2 EI Enrich Mediator 删除 JSON 字段的最佳方法?
- linux - 捕获 i.MX6UL(Linux 内核)的断电中断
- python - Pandas Datareader 没有响应,HTTP 状态 404
- c# - 如何在 Jetbrains Rider 工具箱中添加 Guna UI?
- css - 在 Dash Dropdown 中更改可清除“x”的位置
- python-3.x - 如何在 groupby 表中保留最大列?
- sql - 如果要组合材料来制造新材料,应该如何为新材料设计桌子?
- php - 使用 PHP 类/函数将 NULL 插入到 mySQL-DB 而不是 0000-00-00