mysql - 更新 One2One 关系对象 (JPA 2)

标签 mysql spring jpa-2.0 entity-relationship one-to-one

我有 2 个具有一对一关系的实体(User.class 和 Image.class)。更新图像实体时出现问题。当没有现有的图像对象时它可以工作,我只需创建一个新图像,将其添加到用户(使用setter)对象并保存它,如下所示:

public void addImage(Image image){
    image.setUser(this);
        setImage(image);
    }

..

 //method used to save the user object
    @Override
    @Transactional(readOnly=false)
    public User save(User user) {
        User aUser = userRepository.save(user);
        return aUser;
    }

更新图像时出现问题。我必须手动将每个图像属性添加到现有图像对象(请参阅以下方法)。如果我使用上面的 addImage(),它只会保存新记录,而不会删除现有对象,从而导致数据库中出现多条记录。

有人可以看一下并帮助我找出问题吗?谢谢

//Add a new Profile Image
public void addImage(Image image){
    Image oldImg = getImage();
    image.setUser(this);
    if(oldImg == null){
        setImage(image);
        return;
    }
        oldImg.setName(image.getName());
        oldImg.setVersion(image.getVersion());
    }


User & Image entity extracts

User Entity

@OneToOne(targetEntity=Image.class, 
        mappedBy="user",
        fetch=FetchType.LAZY, 
        cascade={CascadeType.ALL},
        orphanRemoval=true)
private Image image;
...


Image Entity

@JsonIgnore
@OneToOne
@JoinColumn(name="userid")
private User user;

最佳答案

您需要为两个实体实现equals & hashcode。如果没有这些方法,持久性提供程序无法确定对象是否存在。

如果您使用 Eclipse,则可以通过右键单击编辑器、导航到源代码并选择生成等于和哈希码来生成这些方法。

关于mysql - 更新 One2One 关系对象 (JPA 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16882790/

相关文章:

php - 使用 php mysqli 创建账本并根据 DR 和 CR 获取余额

java - 无法通过 Eclipse 连接到 Google Cloud,并且 newInstance 函数被划掉

mysql - 如何从 frm、ib_logfile0 和 ib_logfile1 文件恢复 mysql 数据库

mysql - 使用另一个表值更新一个表记录

java - Websphere Application Server 7 中的 HTTP header Mime 类型

Hibernate:在不重写映射的情况下从核心 API 切换到 JPA API

java - 当主键为 UUID 时,JPA 2 合并是插入而不是更新

java - 如何正确重载 Spring bean 配置

java - 将自定义身份验证包装到 Spring 安全性中的最简单方法?

java - Hibernate 使用 orphanRemoval 触发约束违规