gpt4 book ai didi

java - 当仅设置 id 而不是首先从数据库获取对象时,一对多不会在没有引用的情况下更新

转载 作者:行者123 更新时间:2023-12-02 01:39:06 27 4
gpt4 key购买 nike

我正在将 Spring Hibernate 与 JPA 结合使用。级联=CascadeType.ALL和@Id @GenerateValue(策略= GenerationType.IDENTITY)。我有两个表,一个是用户,另一个是照片,当我想添加新照片时,我是否需要从数据库中获取用户,然后使用 photo.setUser(user) 将其设置为照片中的用户。有没有办法只执行 User user = new User(); user.setId(1) ,然后使用 photo.setUser() 将其放入照片中,而无需完整引用。当我仅设置 id 时,执行 repo.save(photo) 时,我将传递分离的实体以保留。

我想做的是:

User user = new User();
user.setId(1);
photo.setUser(user);
repo.save(photo)

其中用户已在数据库中创建并拥有多张照片。

而不是:

User user = repo.findUserById(1);
photo.setUser(user);
repo.save(photo);

我的实体:

@Entity
@Table(name = "users")
public class Photo implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@OneToMany(cascade = CascadeType.ALL,mappedBy = "user", fetch = FetchType.EAGER)
private List<Photo> photos = new ArrayList<>();


@Entity
@Table(name = "photos")
public class Photo implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@ManyToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;

最佳答案

使用EntityManager.getReference()获取用户对象。与 EntityManager.find() 相比,它的好处是不会触发额外的 SQL 来获取用户对象。

用户对象只是一个仅设置了ID的代理。只需确保在 save 之前不访问除 ID 之外的其他属性,则不会触发其他 SQL 来获取用户,这有利于为具有已知 ID 的现有对象设置外键。

User  user = entityManager.getReference(1, User.class);
photo.setUser(user);
repo.save(photo)

如果您使用 spring-datarepository ,则等效方法是 getOne() ,它将在内部调用 EntityManager.getReference()

关于java - 当仅设置 id 而不是首先从数据库获取对象时,一对多不会在没有引用的情况下更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54727003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com