我想使用这个解决方案:https://stackoverflow.com/a/50378345/13995601
在产品.class:
@JoinColumn(name = "category_id", insertable = false, updatable = false)
@ManyToOne(targetEntity = Category.class, fetch = FetchType.EAGER)
private Category category;
@Column(name = "category_id")
private Long categoryId;
字符串
Category.class
@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "categories")
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "category_sequence")
@SequenceGenerator(name = "category_sequence", sequenceName = "category_sequence", allocationSize = 1)
private Long id;
@NotNull
private String name;
}
Product pr = productRepository.save(product);
System.out.println(pr.getCategory()); // prints null
的数据
但是,当我获取Product时,只有category_id被填充,而不是category,我想要category字段。我在我的应用程序中的大多数地方都使用了这种方法,所以对我来说了解情况很重要。
2条答案
按热度按时间llycmphe1#
字符串
根据你对这个问题的评论,我认为你在持久化
Product
之前只设置了一个类别ID,而不是Category
。在这种情况下,打印“null”并不奇怪。用save()
持久化一个新实体会使其现有状态持久化。不能保证它的状态会从数据库中更新,或者,特别是,关系会被重新获得。为什么会这样?他们刚刚被拯救了。我认为您Map
category
和categoryId
可能弊大于利,但是如果您继续这样做,那么您将需要在保存产品实体之后手动刷新它们,以确保与它们关联的Category
categoryId
(新的或可能更改的)被获取。给定适当的HibernateSession
作为sess
,这将是型
或者给定适当的
EntityManager
作为em
,您可以使用em.refresh(pr)
而不是sess.refresh(pr)
。看起来您正在使用Spring Data,但其存储库接口没有定义您可以直接使用的刷新方法,也没有提供访问底层Session
或EntityManager
的方法,因此您必须对此进行整理。kdfy810k2#
我建议你不要使用lombok,如果你有复杂的实体Map,为了让你正确地跟踪哪些实体Map到哪些实体。不要忘记当你加入的时候强制的referencedColumnName和外键,如果你的产品类中有外键的话。你是通过id将它加入到你的类别表中的,所以在你的类别类中,你的id列名必须设置为正确地引用它。
--编辑
示例代码段:
Authorities.class
字符串
User.class
型