级联的实体映射似乎不起作用

时间:2018-08-26 15:31:49

标签: java hibernate

我有以下情况:

OrganisationEntity.java

@Entity
@Table(name = "organisation")
public class OrganisationEntity {
    // ...
    private PersonEntity contactPerson;
    // ...    
    @OneToOne
    @JoinColumn(name = "contact_person_id", referencedColumnName = "id", nullable = false)
    public PersonEntity getContactPerson() {
        return contactPerson;
    }

    public void setContactPerson(PersonEntity contactPerson) {
        this.contactPerson = contactPerson;
    }
    // ...
}

ContactPerson.java

@Entity
@Table(name = "person")
public class PersonEntity {
    private int id;
    // ...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false)
    public int getId() {
        return id;
    }

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

在数据库上,表Organization具有一个不可空的Person外键。实体映射是单向的新建,当我想在merge上用OrganisationEntity保留一对新记录(一个组织和一个人)时,出现以下错误:

  

17:10:19.827警告[http-nio-8080-exec-2]   [org.hibernate.action.internal.UnresolvedEntityInsertActions] [144]   HHH000437:尝试保存一个或多个具有以下属性的实体:   与未保存的临时实体的不可为空的关联。未保存的   必须先将临时实体保存在操作中,然后再保存这些实体   相关实体。

     

未保存的临时实体:   ([ch.freiwilligenarbeit_sempach.entity.PersonEntity#0])

     

从属实体:   ([[ch.freiwilligenarbeit_sempach.entity.OrganisationEntity#]])

     

非空关联:   ([[ch.freiwilligenarbeit_sempach.entity.OrganisationEntity.contactPerson])

这对我来说非常有意义,因为它试图插入不引用任何人的组织。因此,我通常会定义一个级联行为,以便冬眠首先将人插入,在组织上设置参考,然后继续组织。我在组织实体上尝试了以下方法:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contact_person_id", referencedColumnName = "id", nullable = false)
public PersonEntity getContactPerson() {
    return contactPerson;
}

@OneToOne
@JoinColumn(name = "contact_person_id", referencedColumnName = "id", nullable = false)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
public PersonEntity getContactPerson() {
    return contactPerson;
}

但似乎两者都不起作用。我仍然遇到相同的错误。但是我认为这应该确实有效。

我们非常感谢您的帮助!预先感谢。

2 个答案:

答案 0 :(得分:0)

我不完全了解您想要什么,但是我想您想将一个人实体保存到一个人组织中。 如果您使用其他ID,则应添加@OneToOne注释和属性mappedBy=contactPerson

在PersonEntity类中

@OneToOne(cascade = CascadeType.ALL, mappedBy = "contactPerson")
private OrganisationEntity orgEntity;

在OrganisationEntity类中

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "contact_person_id", nullable = false)
private PersonEntity contactPerson; // name which is pointed as mappedBy attribute

然后,您可以保存这种正确的书写方式

orgEntity.setContactPerson(contactPerson);
orgRepo.save(orgEntity);

p.s。我使用场注入进行编写,但这不是必需的。

答案 1 :(得分:0)

这成功了。

@Cascade(org.hibernate.annotations.CascadeType.ALL)

尽管我相信我停止了tomcat并清理了重新部署的Web应用程序,但我昨天没有工作。如今,它可以按预期工作,因此将引用实体(人)插入到引用实体(组织)之前。