【问题标题】:Updating One2One Relationship Object (JPA 2)更新 One2One 关系对象 (JPA 2)
【发布时间】:2013-06-02 12:31:48
【问题描述】:

我有 2 个具有 OneToOne 关系的实体(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;

【问题讨论】:

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


    【解决方案1】:

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

    如果您使用 Eclipse,您可以通过右键单击编辑器、导航到源并选择 Generate Equals and Hashcode 来生成这些方法。

    【讨论】:

    • 您的建议导致 StackOverFlowError:org.joda 的 org.joda.time.chrono.AssembledChronology.getZone(AssembledChronology.java:107) 的线程“main”java.lang.StackOverflowError 异常。 time.chrono.ISOChronology.hashCode(ISOChronology.java:200) at org.joda.time.base.AbstractInstant.hashCode(AbstractInstant.java:278) at com.core.user.User.hashCode(User.java:249)在 com.core.user.Image.hashCode(Image.java:94)....
    猜你喜欢
    • 2021-07-13
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2019-02-11
    相关资源
    最近更新 更多