gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:16:04 25 4
gpt4 key购买 nike

我有两个相关实体,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com