我有两个相关实体,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 应该指向数据库中的一个对象,这让我想知道这个错误是什么以及如何修复它。
拜托,我需要像昨天一样修复。谢谢大家。
最佳答案
您当前的映射未设置注册/机构协会的所有者。
如果您希望注册控制关联(最常见),那么这是您的映射:
@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; }
如果您希望机构控制关联(不那么常见),那么您的映射将变为:
@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/