仅设置ID而不是先从数据库中获取对象时,一对多的更新不会在没有引用的情况下发生

时间:2019-02-16 19:44:36

标签: java spring hibernate jpa

我将Spring Hibernate与JPA结合使用。级联= CascadeType.ALL和@Id @GeneratedValue(策略= 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;

1 个答案:

答案 0 :(得分:2)

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

用户对象只是设置了ID的代理。只需确保在保存之前不要访问ID以外的属性,那么就不会触发其他SQL来吸引用户,这对于设置具有已知ID的现有对象的外键非常有用。

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

如果您正在使用spring-data存储库,则等效方法为getOne(),它将在内部调用EntityManager.getReference()