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

标签 java spring hibernate jpa

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

相关文章:

java - 更改 Tapestry 中的页面名称

java - 使用内存数据库和模拟测试 DAO 和服务层

hibernate - hibernate 实体中IP地址的最佳类型?

java - 在 Spring Security 中使用个人资料名称或电子邮件登录

hibernate - 如何将ID映射到Grails中的其他列?

java - 快速获取 YYYYMMDD 格式的日期数字的方法?

java - 如何使用 Java 线程并行化 ArrayList 操作?

java - Spring 3.0.5.RELEASE 依赖信息

hibernate - 在 Hibernate 中使用 CascadeType

android - 将 MultiPart 文件从 Android 上传到服务器(SpringMVC)