java - Hibernate 在保存实体时抛出 TransientPropertyValueException

标签 java hibernate orm entity hibernate-mapping

我有两个相关实体,Institution 和 Registration,因此 Registration 和 Institution 之间存在多对一关系。因此,我们应该能够拥有单个机构的注册条目。

实体和关系映射:

@Entity
public class Registration{

    @NotNull @ManyToOne(optional=false)
        @JoinColumn(updatable=false, insertable=false)
        private Institution institution;

}


@Entity
public class Institution{
    @OneToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE}, fetch=FetchType.EAGER, mappedBy="institution", orphanRemoval=true)
        private Set<Registration> registrations;
}

错误跟踪可用here :

[INFO] 04:34:26,043 WARN  [org.hibernate.action.internal.UnresolvedEntityInsertActions] (http-localhost/127.0.0.1:8888-4) HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
[INFO]  Unsaved transient entity: ([com.bitrunk.apps.nussa.client.shared.Institution#<null>])
[INFO]  Dependent entities: ([[com.bitrunk.apps.nussa.client.shared.Registration#<null>]])
[INFO]  Non-nullable association(s): ([com.bitrunk.apps.nussa.client.shared.Registration.institution])
[INFO] 04:34:26,046 ERROR [stderr] (http-localhost/127.0.0.1:8888-4) java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation: 

错误是:由以下原因引起:org.hibernate.TransientPropertyValueException:非空属性引用 transient 值 - 在当前操作之前必须保存 transient 实例:Registration.institution -> Institution

这很奇怪,因为在注册期间,用户使用下拉小部件从数据库中已有的条目中选择他/她的机构,这样 Registration.institution 应该指向数据库中的一个对象,这让我想知道这个错误是什么以及如何修复它。

拜托,我需要像昨天一样修复。谢谢大家。

最佳答案

您当前的映射未设置注册/机构协会的所有者。

  1. 如果您希望注册控制关联(最常见),那么这是您的映射:

    @Entity
    public class Registration{
    
        @NotNull 
        @ManyToOne(optional=false)      
        private Institution institution;
    
    }
    
    
    @Entity
    public class Institution{
        @OneToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE}, fetch=FetchType.EAGER, mappedBy="institution", orphanRemoval=true)
        private Set<Registration> registrations;
    }
    
  2. 如果您希望机构控制关联(不那么常见),那么您的映射将变为:

    @Entity
    public class Registration{
    
        @NotNull 
        @ManyToOne(optional=false)
        @JoinColumn(updatable=false, insertable=false)          
        private Institution institution;
    
    }
    
    
    @Entity
    public class Institution{
        @OneToMany(cascade={CascadeType.REMOVE, CascadeType.MERGE}, fetch=FetchType.EAGER, orphanRemoval=true)
        private Set<Registration> registrations;
    }
    

你不能同时设置 (updatable=false, insertable=false) 和 mappedBy 因为这样这两个关联端都不能控制关联,告诉 Hibernate 在将对象状态与数据库同步时调查哪一方。

关于java - Hibernate 在保存实体时抛出 TransientPropertyValueException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25072653/

相关文章:

java - 如何在复杂项目中包含属性文件

java - 如何打印数组中出现的所有最大的两个整数?

java - Hibernate.initialize(list) 与 setFetchMode

jpa - 通过未标记为级联 PERSIST 的关系找到了新对象

orm - 如何将 Doctrine2 实体图转换为数组

python - SQLAlchemy:单表继承,子项中的同一列

java - 如何在 Maven 中使用来自 Maven 中央仓库的特定(非默认)jar? (配置单元执行)

java - 验证 XSD 本身

hibernate - 如何在 Grails 应用程序中监控 Hibernate 统计信息(缓存命中和未命中)?

java - JPA 和 Spring 对带有异常和泛型的 DAO 的处理