Внешний ключ JPA не устанавливается в @OneToOne - PullRequest
0 голосов
/ 05 марта 2019

У меня сопоставлены отношения @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), для другого поля в дочерней таблице, но не смог, поскольку Sequence # не генерируется до тех пор, пока объект не будет сохранен , Фактическое поле внешнего ключа осталось пустым.

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) первичным ключом родительской таблицы?

1 Ответ

1 голос
/ 06 марта 2019

Посмотрев на это несколько часов, я понял, что cascade = CascadeType.PERSIST должно быть cascade = CascadeType.ALL

...