当前位置: 首页 > 知识库问答 >
问题:

使用hibernate保存父表时在外键中插入Null

许琛
2023-03-14

我试图用Hibernate保存一个表。父表与其子表具有一对多关系。父表POJO有其子表POJO的集合。

当我保存父表时,数据也被插入到它的子表中,但它的外键不为NULL。

下面是我的代码:家长:

public class Parent implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 45)
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "parentid", cascade = CascadeType.ALL, fetch=FetchType.LAZY)
private Collection<Child> childCollection;

public Parent() {
}

public Parent(Integer id) {
    this.id = id;
}

public Integer getId() {
    return id;
}

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

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@XmlTransient
public Collection<Child> getChildCollection() {
    return childCollection;
}

public void setChildCollection(Collection<Child> childCollection) {
    this.childCollection = childCollection;
}

@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 Parent)) {
        return false;
    }
    Parent other = (Parent) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "beans.Parent[ id=" + id + " ]";
}
}

儿童:

public class Child implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Size(max = 45)
@Column(name = "comments")
private String comments;
@JoinColumn(name = "parentid", referencedColumnName = "id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Parent parentid;

public Child() {
}

public Child(Integer id) {
    this.id = id;
}

public Integer getId() {
    return id;
}

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

public String getComments() {
    return comments;
}

public void setComments(String comments) {
    this.comments = comments;
}

public Parent getParentid() {
    return parentid;
}

public void setParentid(Parent parentid) {
    this.parentid = parentid;
}

@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 Child)) {
        return false;
    }
    Child other = (Child) object;
    if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "beans.Child[ id=" + id + " ]";
} }

Hibernate服务:

public class HibernateSave {
public static void main(String[] args) {
            SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

    Session session = sessionFactory.openSession();

            Transaction tx1 = session.beginTransaction();

    Parent parent = new Parent();
            Child child1 = new Child();
            parent.setName("Name");
            child1.setComments("Hey");
            //child1.setParentid(parent);
            List<Child> childs = new ArrayList<Child>();
            childs.add(child1);


            parent.setChildCollection(childs);

            System.out.println("parent Saved id="+session.save(parent));
            tx1.commit();
    session.flush(); //address will not get saved without this
    System.out.println("*****");



} }

我找到了一个解决方案,将我的孩子反向映射到父母,如下所示

child1.setParentid(parent);

但我在想这是否可以避免。我希望还有其他方法,我不需要把我的每个孩子都映射到父母那里。

Kinldy帮助,如果你能解释。

共有1个答案

许展鹏
2023-03-14

如果您更新双向关系的一端,您还必须更新它的另一端,因为维护域模型的正确状态是应用程序的责任。

您可以做的一件事是在Parent中创建一个方法来添加child:

public void addChild(Child child) {
    childCollection.add(child);
    child.setParentId(this);
}

或/和孩子中的另一种方式:

public void setParent(Parent parent) {
    parent.getChildCollection().add(this);
    this.setParentId(parent)
}

(代码没有必要的空检查等,但应该给出的想法)

从而使代码不那么容易出错(即忘记更新关系的另一边)。

似乎还有一个字节码增强,它会将类似的代码添加到实体的类文件中,但我对它的工作情况没有经验(详见此处)

 类似资料:
  • 我有一对一关系的问题-保存后,外键总是被设置为空,即使我有关联的对象。我正在使用Hibernate4.3。7.最终版本为Spring 4.0。0.0版本和MySql 5.6数据库。 在我保存LawFirmProfile对象列后的情况下,参考lawFirm的lawFirm_id始终为空。 实体: 以下是负责保存此记录的代码: Hibernate和Spring配置: 道也是Spring豆,方法注释为@

  • 当我进行插入时,在traduction(idMot references mot)中的外键为null,在前面发送正确的外键。我最终出现了这个错误:not-null属性引用了一个空值或临时值:com.virtual.expertise.mydico.model.traduction.mot 我想我在我的模型中做错了什么,但仍然不知道是什么。 下面是交易表: 下面是我的WebService:(其中id

  • 我有一个单向的一对多关系。一方是父母,多方是孩子。对于一个父母,可以有很多孩子。但是对于一个孩子来说,只有一个父母。在Java方面,关系是单向的,我需要访问父母的孩子,但是我不想为孩子存储父母。所以这些是对象: 起源: 孩子: 这是一段代码,用于创建一个子项、一个具有该子项的父项,然后保存父项: 然后,当我运行代码时,出现了一个错误,因为Hibernate在插入它时没有在CHILD上设置PAREN

  • 问题内容: 我有两个实体: 我正在尝试通过执行以下操作插入文件(以及随后的标签): 然后,我使用以下命令将文件插入DAO: 在我的日志中,我在“文件”表中看到一个插入,在标签表中看到2个插入,但是,指向我的文件表(file_id)的标签表中的外键为NULL。 我可能做错了什么? 问题答案: 您不是将标签的文件设置为文件,而是将标签的文件设置为文件。请记住,在OOP中,与关系模型相反,您必须设置关系

  • 我正在创建一个使用Apache Web服务器(PHPmyAdmin)的PHP网站 我有三张桌子: 品牌 brand_id(主键)自动增加 brand_name < li>item_id(主键)自动递增 < li >项目类别 model_id(主键)自动增加 item_model brand_id(brand.brand_id的外键) brand_name(item.item_id的外键) 数量 价

  • 我们遇到了遗留代码的问题。对于“username”字段有一个验证集,验证其长度并确保至少包含一个字母: 我们面临的问题是,一些现有的遗留数据不适合这些验证,我试图找到一种方法,使这些验证对遗留数据(老用户)被忽略,而仍然适用于新创建的用户。 我正在考虑将验证移到方法(因此仅在实际更改时验证值),但这导致了一个异常: