我有以下情况:
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;
}
但似乎两者都不起作用。我仍然遇到相同的错误。但是我认为这应该确实有效。
我们非常感谢您的帮助!预先感谢。
答案 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应用程序,但我昨天没有工作。如今,它可以按预期工作,因此将引用实体(人)插入到引用实体(组织)之前。