Java jpa一对一关系问题持续存在时

Java jpa一对一关系问题持续存在时,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我有两个一对一关系的模型 @Entity @Table(name = "Form_Item_Production") public class FormItemProduction { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "item_id", nullable = false) private Long itemId;

我有两个一对一关系的模型

@Entity
@Table(name = "Form_Item_Production")
public class FormItemProduction {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id", nullable = false)
    private Long itemId;

   @OneToOne(cascade = CascadeType.ALL)
   @JoinColumn(name = "shift_lookup_id", insertable = false, updatable = false)
   private AppLookup appLookup;

   getter and setter
}
另一个

@Entity
@Table(name = "App_Lookup")
public class AppLookup {

    @Id
    @GeneratedValue
    @Column(name = "Lookup_Id", nullable = false)
    private Long lookupId;

    @Column(name = "Lookup_Name", length = 30, nullable = false)
    private String lookupName;

    getter and setter
}
当我试图坚持保存formitemproduction值时

public boolean insertItem(List<FormItemProduction> f) {
for (FormItemProduction i : f) {
    System.out.println("A" + i.getAppLookup().getLookupId());  // prints the correct id of applookup
    i.setItemId(null);

    entityManager.persist(i);
}

entityManager.flush();

return true;
}

据我所知,这是单向的一对一映射,所以我不太明白为什么要分离错误?

您有
itemId
,它不能为
null

@Column(name=“item\u id”,nullable=false)
私有长项目ID;
实际上,您将
itemId
设置为
null

i.setItemId(null);
所以这条线

entityManager.persist(i);

无法保存数据。

您已将“级联”设置为“全部”:

@OneToOne(cascade = CascadeType.ALL)
这意味着您将所有操作级联到相关字段
AppLookup


您可以将cascade设置为none,您将不会再收到错误,但不会对
AppLookup
字段执行db操作。

通过更改以下内容进行修复:

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "shift_lookup_id", insertable = false, updatable = false)
private AppLookup appLookup;
致:


@OneToOne(cascade=CascadeType.ALL)
已设置。。。你在说什么?你可以将cascade设置为none他从不分离对象或与之交互,为了持久,ITEMID应该是NULL,所以Hibernate会把它看作一个新的记录并使用插入。query@ArnoldCristobal来自现有
formTempProduction
的新记录引用了相同的
AppLookup
,该记录打破了
@OneToOne
关系。
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "shift_lookup_id", insertable = false, updatable = false)
private AppLookup appLookup;
@OneToOne
@JoinColumn(name = "shift_lookup_id", insertable = true, updatable = true)
private AppLookup appLookup;