我有一个问题是使用Hibernate持久保存实体Permission。我需要保存许多Permission对象,它有一个属性Group(外键),但是在我保存Permission的同时,我正在保存Group,所以我没有要设置的Group ID(主键)用于建立关联的权限对象。
我的关系:
@Entity
@BatchSize(size = 10)
public class Group implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "grupo")
@JsonIgnore
private List<Permissao> permissoes;
}
@Entity
@BatchSize(size = 10)
public class Permission implements Serializable {
@ManyToOne
private Grupo grupo;
}
堆栈:
SEVERE: Servlet.service() for servlet [hemisphere-web] in context with path
[/hemisphere-web] threw exception [Request processing failed; nested exception is
org.springframework.dao.InvalidDataAccessApiUsageException:
org.hibernate.TransientPropertyValueException: object references an unsaved transient
instance - save the transient instance before flushing:
net.pontoall.hemisphere.core.model.Permission.grupo ->
net.pontoall.hemisphere.core.model.Grupo; nested exception is
java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object
references an unsaved transient instance - save the transient instance before flushing:
net.pontoall.hemisphere.core.model.Permissao.grupo ->
net.pontoall.hemisphere.core.model.Grupo] with root cause
org.hibernate.TransientPropertyValueException: object references an unsaved transient
instance - save the transient instance before flushing:
net.pontoall.hemisphere.core.model.Permissao.grupo -> net.pontoall.hemisphere.core.model.Grupo
有人可以给我一个提示吗?
答案 0 :(得分:1)
首先,当您使用JPA / Hibernate时,您正在处理对象。您不需要将组ID设置为您只是将组实例传递给它的权限对象。
现在根据你的映射,你在组中的权限列表上有一个级联,所以你应该保存组,它应该可以正常工作。 如果你试图保存权限而不先保存组,那么你可能会得到一个TransientObjectException。
答案 1 :(得分:1)
或者,您也可以使用从权限到组的级联,这样当您保存属于新组的新权限时,该组也将被保留:
@ManyToOne(cascade=CascadeType.PERSIST)
private Group group;