【问题标题】:why JPA Foriegn Key Related (@ManyToOne )Child objects are getting detached on persisting the parent object为什么JPA外键相关(@ManyToOne)子对象在持久化父对象时被分离
【发布时间】:2014-07-16 01:59:30
【问题描述】:

在持久化父对象后,我的子对象将被分离一次。在返回父对象查看时,我的子对象为空。为了解决这个问题,我再次从数据库中获取对象以在视图中进行处理。

//伪代码

父实体

class Donor{
  @ManyToOne(fetch = FetchType.EAGER)
  private PreferredLanguage  preferredLanguage;
}

子实体

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.preferredlanguage;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author srikanth
 */
@Entity
public class PreferredLanguage  {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false, insertable=false, updatable=false)
    private Long id;

    @Column(length=20)
    private String preferredLanguage;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPreferredLanguage() {
        return preferredLanguage;
    }

    public void setPreferredLanguage(String preferredLanguage) {
        this.preferredLanguage = preferredLanguage;
    }


    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof PreferredLanguage)) {
            return false;
        }
        PreferredLanguage other = (PreferredLanguage) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

}

Crntroller AddDonor 方法

savedDonor = donorRepository.addDonor(donor);

存储库方法

  public Donor addDonor(Donor donor) {
    updateDonorAutomaticFields(donor);
    em.persist(donor);
    em.flush();
    return donor;
  }

【问题讨论】:

  • -1 缺少相关代码。
  • 这是不可能的,除非你错过了什么。请添加更多详细信息。
  • 好的,让我编辑添加代码
  • 您能否解释一下您的子对象已分离是什么意思?你的意思是当你调用persist时,关系设置为null?那里有什么,您希望发生什么,您如何读取子对象或将它们持久化(如果它们是新的)?

标签: java spring hibernate jpa


【解决方案1】:

能否提供代码sn-ps,

我猜,你的子对象可能是 FetchType FetchType.LAZY

【讨论】:

  • 应该是评论而不是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2018-01-25
  • 2012-05-14
  • 2014-04-07
  • 2011-11-28
  • 2012-10-24
相关资源
最近更新 更多