Java OneTONE外键保存问题

Java OneTONE外键保存问题,java,hibernate,jpa,Java,Hibernate,Jpa,这是ds1350和申请人类别的代码。我使用hibernate session save()保存申请者,其中ds1350包含在申请者对象中。我有一个很好的办公室,但这个办公室不工作。applicator.getDs1350()抛出NullPointerException,因为外键(ds1350中的applicator_id)被保存为null和applicationDao。getapplicationByPrimaryKey(applicationId)无法获取ds1350对象。去掉“@fetch(

这是ds1350和申请人类别的代码。我使用hibernate session save()保存申请者,其中ds1350包含在申请者对象中。我有一个很好的办公室,但这个办公室不工作。applicator.getDs1350()抛出NullPointerException,因为外键(ds1350中的applicator_id)被保存为null和applicationDao。getapplicationByPrimaryKey(applicationId)无法获取ds1350对象。

去掉“@fetch(value=FetchMode.SELECT)”。您告诉它在OneTONE注释中急切地获取,但随后告诉它在@fetch注释中懒惰地获取

此外,确保ds1350字段上的联接列引用了正确的FK字段(如果申请者中的字段未被称为id)

另一点我一开始没注意到的是你正在使用

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "applicant_id", referencedColumnName= "applicant_id")
private DS1350 ds1350; 
引述: “指示持久性提供程序必须使用数据库标识列为实体分配主键。”

如果在创建链接时没有手动分配想法,则不会保留id。使用@GeneratedValue(strategy=AUTO)将告诉数据库它需要为您的子类(DS1350)生成ID。这是一个解决方案,但可能不是你想要的

此外,根据您的更新,您在“加入”列中引用了错误的外键,并且ds1350与申请人之间的关联看起来可疑,请尝试以下操作:

   @GeneratedValue(strategy=IDENTITY)

我还没有测试过。

你能在创建
申请人
DS1350
实体的地方发布代码并保存它们吗?私有void initDS1350(){DS1350=new DS1350();DS1350.setDs1350Number(“ds1350Number”);DS1350.setCreatedBy(“JUNIT”);DS1350.setCreatedDate(Calendar.getInstance();applicator.setDs1350(ds1350);}公共类applicationdaotest{@Autowired private applicationdao applicationdao;//域对象private ds1350 ds1350=new ds1350();我使用从setup()调用的方法创建申请者请在此处发布完整的ds1350和申请人类。Applcant和ds1350 has字段均命名为申请人id,申请人中的PK和ds1350中的FK,我是否应在申请人中使用ReferenceColumnName=“ApplicationId”作为ReferenceColumnName=“申请人id”然后?尝试了建议的更改,运气不佳,问题相同。DS1350中的外键未保存。ReferenceColumnName=“申请人\u id”@OneToOne(fetch=FetchType.EAGER,cascade=CascadeType.ALL)@fetch(value=FetchMode.SELECT)@JoinColumn(name=“申请人\u id”)专用DS1350 DS1350;此选项适用于OneToMany,但不适用于OneToOneDi我不明白这一点:另外,请确保DS1350字段上的联接列引用了正确的FK字段(如果申请者中的字段不是id)。我需要在DS1350类中添加任何内容吗?
   @GeneratedValue(strategy=IDENTITY)
 //in applicant
    @OneToOne(cascade = CascadeType.ALL)
    @Fetch(value = FetchMode.SELECT)
    @JoinColumn(name = "ds1350_id", referencedColumnName= "applicant_id")
    private DS1350 ds1350;

   //in ds1350
   @OneToOne(mappedBy="applicant", cascade=CascadeType.ALL)
   private Applicant applicant; // Unique id for each applicant