java - 我如何要求对@PrimaryKeyJoinColumn 强制执行?
问题描述
我正在创建一个 SpringBoot 应用程序,它的部分功能是创建用户,以及这些用户之间的对话。创建了以下实体..
- 用户(参与对话的人)
- 对话(记录持有对话的拥有用户)
- ConversationUser(记录持有所涉及的用户以及进行哪个对话)
问题是,我的 JpaRepository.save(ConversationUser) 让我插入一条带有不存在用户引用的记录。如何强制此 ConversationUser 仅在关联用户具有现有 ID 时才能插入?
我尝试在 ConversationUser 上使用@ManyToOne
and@PrimaryKeyJoinColumn
来尝试强制执行真实记录的存在,但没有成功。
User.class
@Entity
public class User {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
@Column(updatable = false, unique = true, nullable = false)
@Type(type = "uuid-char")
protected UUID id;
@Column(unique = true, nullable = false)
protected String username;
@Column(nullable = false)
protected char[] password;
@Column(nullable = false)
protected String firstName, lastName;
@Column(unique = true, nullable = false)
protected String email;
}
ConversationUser.class
@Entity
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {
"conversation_id",
"user_id"
})
})
public class ConversationUser {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator")
@Column(updatable = false, unique = true, nullable = false)
@Type(type = "uuid-char")
private UUID id;
@ManyToOne(cascade = CascadeType.REMOVE)
@PrimaryKeyJoinColumn(name = "conversation_id", referencedColumnName = "id")
private Conversation conversation;
@ManyToOne(optional = false)
@PrimaryKeyJoinColumn(name = "user_id", referencedColumnName = "id", foreignKey = @ForeignKey(name = "fk_user_id"))
private User user;
}
我希望由于ConversationUser.user
设置的方式,如果我尝试运行以下测试,它将产生异常。但是,此测试失败并且不会生成异常。我检查了数据库,并且正在插入该行。
@Test(expected = Exception.class)
public void testFakeAttendeeOfConversation() {
UserModel fakeUserModel = generateRandomUser();
fakeUserModel.setId(UUID.randomUUID());
conversationService.createConversation(new JwtUser(userA), Collections.singleton(fakeUserModel.getId()));
}
调用 ConversationUser 存储库接口的函数(extends JpaRepository<ConversationUser, UUID>)
如下..
@Transactional
public void addUserToConversation(JwtUser jwtRequestUser, Conversation conversation, UUID attendeeId) {
User attendee = User.builder().id(attendeeId).build();
ConversationUser conversationUser = ConversationUser.builder()
.conversation(conversation)
.user(attendee)
.build();
conversationUserRepository.save(conversationUser);
}
有谁知道为什么ConversationUser
即使其中引用的用户在数据库中不存在,我也可以插入任何内容?
解决方案
推荐阅读
- sql - 使用计算的时间戳设置“VALID UNTIL”值
- html - 如何在仪表板页面上写“用户名”?节点
- python-2.7 - PyParsing Or 作为 matchFirst Or 执行
- javascript - 无法使用 sinon 模拟护照身份验证(“本地”)方法
- excel - 我认为剪贴板在这段代码中是空的。我能做些什么?
- multithreading - 静态本地 CCriticalSection 无法正常工作
- azure - Azure API 管理:开放 API(无订阅密钥)仍然给出错误 401
- django-2.1 - 在 Django2.1 中创建 CreatingUserField、created_date、updated_by 和 updated_date 的替代方法
- javascript - 如何获取对象数组而不是数组数组
- bash - 用给定的字符串替换行的子字符串