我正在将 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/