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

Hibernate一对多映射在保存时插入重复记录

柳浩大
2023-03-14

我在Parent中提供了一个简单的oneToMany关系,并在Chile Entity类中提供了相应的ManyToOne:

起源:

@Entity
@Table(name = "FormExtraInfo")
@PrimaryKeyJoinColumn(name="form_container_id")
public class Form extends Container {

private List<Reason> reasons = new ArrayList<Reason>();

@OneToMany(mappedBy="form",cascade={javax.persistence.CascadeType.ALL},orphanRemoval=true)
@Cascade(value={CascadeType.ALL})
public List<Reason> getReasons() {
    return reasons;
}

public void setReasons(List<Reason> reasons) {
    this.reasons = reasons;
}

public void addReason(Reason reason) {
    if (this.reasons == null) {
        this.reasons = new ArrayList<Reason>();
    }

    this.reasons.add(reason);
}

}

儿童班级:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="Container_id")
public Form getForm() {
    return form;
}

public void setForm(Form form) {
    this.form = form;
}

操作类:

//Set the reasons
    String[] reasonStatus = strutsForm.getMultiValueProperty(REASON_STATUS);
    String[] reasonText = strutsForm.getMultiValueProperty(REASON_TEXT);

    List<Reason> reasons = new ArrayList<Reason>();     

    logger.debug("form container ID : " + form.getId() +". # of Reasons for this form: "+ reasonText.length);

    for (int i = 0; i < reasonText.length; i++) {
        Reason r = new Reason();
        r.setComment(reasonText[i]);
        r.setStatusTypeCode(reasonStatus[i]);
        r.setForm(form); 
        reasons.add(r);
    }
    form.setReasons(reasons);

示例案例:Status_code Reason_text abc abc1 xyz xyz1

保存表单:Status_code Reason_text abc abc1 xyz xyz1 abc abc1 xy z xyz2

对于任何操作:New insert、delete或update,它首先将旧数据复制到DB,然后执行我执行的操作。

共有2个答案

堵凯
2023-03-14

如果可以用集合代替列表;然后,尝试将集合更改为集合,并确保覆盖equals() hashCode(),如下所示:

https://community.jboss.org/wiki/EqualsAndHashCode?_sscc=t

此外,删除重复的级联,您可以使用:

@OneToMany(mappedBy="form",cascade={javax.persistence.CascadeType.ALL},orphanRemoval=true)

@OneToMany(mappedBy="form")
@Cascade(value={CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
慕容品
2023-03-14

尝试为此替换级联子句

@Cascade (value={CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN})

看看我的博客文章,关于一对多的映射http://arecordon.blogspot.com.ar/2013/05/hibernate-mapping-associations-one-to_20.html

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

  • 我有两个实体类,如下所示- 我在保存子记录时出错。 错误- Hibernate:插入子(名称,child\u id)值(?,)2022-07-19 23:12:31.727警告20940---[nio-8080-exec-2]o.h.engine.jdbc.spi。SqlExceptionHelper:SQL错误:0,SQLState:23502 2022-07-19 23:12:31.727错误

  • 下面的映射给出的错误为 从db.karateInvoiceDetail引用db.karateInvoice的外键的列数错误。应为1 想法是有一个表,它的组合键为(id、fiscalyear和companyId),而表的组合键为(seqNo、InvoiceId、InvoiceFiscalYear和InvoiceCompanyId)。

  • 我定义了2个具有单向一对多关系的实体: 在command.class中: 在StockDetails.class中: null

  • 如何用额外的列保存多对多映射对象?专列为“审批”。对于多对多注释,我只调用了setUsersDocuments(users),它工作正常...我怎样才能使它工作与额外的列? 文件 用户类 主键 多对多表 正在保存单据 编辑:unsuccessfull保存对象-Document.GetDocumentsForUsers().Add(userDocuments)null. 编辑:错误 null

  • 我不是JPA/Hibernate方面的专家,我真的不知道我试图实现的是不可能实现的还是我做错了,既然我预计是后者,这里就什么也不做了。 我有一个map ,我正试图将其持久化到一个表中,并遵循了这里描述的示例:使用JPA存储map 但随后我得到一个HibernateException:列值的STATE_MAP中的列类型错误。找到:bigint,应为:char(255) 当我将bigint更改为cha