在已保存的对象上获取“对象引用未保存的瞬态实例”

时间:2017-03-28 21:03:11

标签: java hibernate jpa

我有一个Report对象,它有一个'reporter'属性。这个“记者”是对Person已存在的ssn的引用。当我尝试在记者属性上保存Report对象时,我得到“对象引用未保存的瞬态实例”,但此人已经在Persons表中。

@Entity
@Table(name="REPORTS")
public class Report {
    @Id
    private long id;

    @OneToOne
    @JoinColumn(name="reporter", 
         referenceColumnName="ssn") // <-- Joining to a non-primary key property
    private Person reporter;
    // mutators
}

@Entity
@Table(name="PERSONS")
public class Person {
    @Id
    private long id;
    @Column(name="ssn")
    private long ssn;
    // other properties

    // mutators
}

这是我看到抛出异常的地方:

public ReportTask implements Runnable {
   @Autowire
   private String reportName;
   @Autowire
   private ReportRepository reportRepo;
   @Autowire
   private PersonRepository personRepo;

   public void run(){
      Person p = personRepo.getByName(reportName);  // gets Person Entity by Name
      Report r = new Report();
      r.setName("Report for "+reportName);
      r.setReporter(p);

      reportRepo.save(r);  // <-- Exception is thrown here
   }
}

异常声明Person对象是暂时的,需要在保存Report对象之前保存。

另外,为了使事情更有趣,似乎前89条记录插入完美;它只在90号失败。我检查了所有值,记录89和90之间没有区别......

1 个答案:

答案 0 :(得分:0)

如果有人遇到同样的问题,我想发布我的问题。它也可以帮到你。

我的问题是null字段值。它在我的原始问题中被省略了,因为它是出于审计目的而在“对象”功能中没有发挥作用,但是看起来如果Hibernate看到null值,它会将对象视为新的实例并试图坚持它(或者至少在我的情况下)