当前位置: 首页 > 知识库问答 >
问题:

数据未保存:对象引用了一个未保存的暂态实例-在刷新[重复]之前保存暂态实例

姜乐家
2023-03-14
@Entity (name = "user")
public class User {

   @Id @GeneratedValue (strategy = GenerationType.IDENTITY)
    private int userId;
    private String username;
    private String password;

   @ManyToOne ()
   @JoinColumn (name = "countryId")
   private Country country;

    //Getter & Setter
 }


@Entity (name = "country")
public class Country {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int countryId;
    private String countryName;
   //Getter & Setter
}

当我尝试保存user对象时,会出现以下异常

  org.hibernate.HibernateException: Data was not saved: object references an unsaved transient instance - save the transient instance before flushing: com.kyrogaming.models.Country

我怎样才能修复这个问题?

共有1个答案

鲍建业
2023-03-14

在告诉Hibernate这个新保存的对象所引用的所有其他对象之前,您不能将内容保存到Hibernate。因此,在本例中,您告诉Hibernate关于用户,但没有告诉它关于国家

你可以用两种方法来解决这样的问题。

手动

您可以为Hibernate指定此关系应该使用CascadeType传播一些操作。在本例中,CascadeType.persist将完成这项工作,CascadeType.All也将完成这项工作。

参照现有国家

但是,根据您对@zerocool的响应,您有第二个问题,即当您有两个user对象具有相同的country时,您不能确保它是相同的country。为此,您必须从数据库中获取适当的国家,在新用户上设置它,然后保存用户。然后,您的两个user对象将引用相同的country,而不仅仅是两个恰好具有相同名称的country实例。查看CriterialAPI作为获取现有实例的一种方法。

 类似资料: