【发布时间】:2022-01-16 03:59:48
【问题描述】:
hibernate-core 与 JPA 集成相当新。我们的实体看起来像
@MappedSuperclass
abstract class BasicEntity {
@Id
@GenericGenerator(name="uuid",strategy="uuid")
@GeneratedValue(generator="uuid")
private String id;
}
@Entity
@Table(name = "book")
class Book extends BasicEntity {
@ManyToOne
@JoinColumn(name="book_genre")
Genre genre
@Column(name="texture")
String texture;
}
@Data //lombok
@Entity
@Table(name="user_book_mapping")
class UserBookMapping extends BasicEntity {
@ManyToOne
@JoinColumn(name = "book_id")
private Book book;
@Column(name="user_id")
String user_id;
}
我要对用户阅读的每一本书执行upsert(同一用户可以阅读一本书两次)UserBookMapping 表。请求对象包含一组用户和书籍[{userId, bookId}] 属性供我处理。
目前我遇到了一个解决方案,我最终首先从主表中获取 Book 实体,然后使用 userId+bookId 的组合获取这样的行是否已经存在,然后创建 @ 的新实例987654327@将其写入数据库。
在我看来,这在任何意义上都没有优化。理论上(以及在 NoSql 世界中),我要做的就是确保请求有效的bookIds(EXISTS),然后为UserBookMapping 执行UPSERT。但我对在计算时将数据写入和将数据表述为 java 对象的方式感到困惑。
第一季度。我真的需要构造Book 实体吗?
第二季度。什么是干净的方式来做我想要实现的目标?
【问题讨论】:
-
您能说明一下想要的效果吗?您希望插入哪个数据实体,
Book? -
如果您只处理现有的
Books 并且只想在Book和UserBookMapping之间建立关联,您可以简单地使用entityManager.getReference()。无需实际获取Book实体 -
@crizzis 感谢您的回复。我正在尝试更新
UserBookMapping,您能否详细说明entityManager.getReference方面?