保存双向关系对象

时间:2013-05-16 13:01:38

标签: hibernate jpa

我有一个问题是使用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

有人可以给我一个提示吗?

2 个答案:

答案 0 :(得分:1)

首先,当您使用JPA / Hibernate时,您正在处理对象。您不需要将组ID设置为您只是将组实例传递给它的权限对象。

现在根据你的映射,你在组中的权限列表上有一个级联,所以你应该保存组,它应该可以正常工作。 如果你试图保存权限而不先保存组,那么你可能会得到一个TransientObjectException。

答案 1 :(得分:1)

或者,您也可以使用从权限到组的级联,这样当您保存属于新组的新权限时,该组也将被保留:

@ManyToOne(cascade=CascadeType.PERSIST)
private Group group;