【问题标题】:JPA Foreign Key Not being Set in @OneToOneJPA 外键未在 @OneToOne 中设置
【发布时间】:2019-03-05 20:58:42
【问题描述】:

我映射了一个@OneToOne 关系。我可以获取记录并查看关系,但我无法创建记录并使外键保持不变。目前,当在父表(FacilityGeneral)中创建新记录时,我也在 ChildTable(FacilityLocation)中创建新记录,但是,子表中的外键不会自动创建。

@Entity
public class FacilityGeneral {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "facilityGenIdSeq")
@SequenceGenerator(name = "facilityGenIdSeq", initialValue = 567, allocationSize = 1)
@Column(updatable = false, unique = true)
private Long generalIdPk;

@NotBlank(message = "Facility Name is required")
private String facilityName;

@OneToOne(fetch = FetchType.EAGER, mappedBy = "facilityGeneral", cascade = CascadeType.PERSIST)
@JsonIgnore
private FacilityLocation location;
}


@Entity
public class FacilityLocation {
@Id
@SequenceGenerator(name = "facilityLocationSeq", initialValue = 374, allocationSize = 1)
@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "facilityLocationSeq")
@Column(updatable= false, nullable = false, unique = true)
private Long locationIdPk;

@OneToOne (fetch = FetchType.EAGER)
@JoinColumn (name="facilityIdFk")
private FacilityGeneral facilityGeneral;

我尝试通过将作为父表 (FacilityGeneral) 中的主键创建的序列值分配给子表中的不同字段来以编程方式持久化它,但由于在对象被持久化之前不会生成序列号,因此无法.实际的外键字段仍然为空。

public FacilityGeneral createOrUpdate(FacilityGeneral facility){
    if(facility.getGeneralIdPk() == null) {
        //create new facility
        Number nextInSeq = entityManager.createNativeQuery("SELECT FACILITY_GEN_ID_SEQ.nextval from dual").getFirstResult();
        facility.setGeneralIdPk(nextInSeq.longValue());

        //Create new Records for corresponding relationships
        FacilityLocation location = new FacilityLocation();
        facility.setLocation(location);
        location.setFacilityGeneral(facility);
        //had a none foreignkey field here that I tried to insert to but failed
        //location.setFacilityId(nextInSeq.LongValue());
    }

    return facilityGeneralRepository.save(facility);
}

为了使用父表主键自动填充外键字段 (facilityIdFk),我缺少什么?

【问题讨论】:

    标签: spring-boot jpa one-to-one


    【解决方案1】:

    看了几个小时后,我意识到cascade = CascadeType.PERSIST 必须是cascade = CascadeType.ALL

    【讨论】:

    • 您可以在此处获取更多详细信息dzone.com/articles/beginner%E2%80%99s-guide-jpa-and
    • 谢谢@PatelRomil - 不过我还是有点困惑。我的理解是级联类型 PERSIST 意味着 save() 或 persist() 操作级联到相关实体(howtodoinjava.com/hibernate/hibernate-jpa-cascade-types)。由于我正在执行 save() 操作,我会认为这会奏效。您能否就我在那里忽略的内容提供任何见解?
    • 您可以尝试在具有 CascadeType.PERSIST 的子实体中使用 @MapsId 吗? @OneToOne (fetch = FetchType.EAGER) @JoinColumn (name="facilityIdFk") @MapsId private FacilityGeneral facilityGeneral;
    猜你喜欢
    • 2016-05-26
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2019-04-16
    • 2013-01-13
    • 2021-12-25
    相关资源
    最近更新 更多