当前位置: 首页 > 知识库问答 >
问题:

未在@OneToOne中设置JPA外键

斜向文
2023-03-14

我有一个@OneToOne关系映射。我可以获取记录并查看关系,但我无法创建记录并保留外键。目前,当在父表(FacilityGeneral)中创建新记录时,我也会在子表(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),我缺少什么?

共有1个答案

邬浩涆
2023-03-14

盯着这个看了几个小时后,我意识到级联=CascadeType。PERSIST需要级联=CascadeType。所有

 类似资料:
  • 我有这个型号 而我有这个方法 但是hibernate没有设置实际地址id和注册地址id(它是OneTONE) Hibernate:插入客户(名字、姓氏、中间名、性别)值(?、、?、?)2021-03-18 14:01:58.340警告12836---[nio-8080-exec-1]o.h.发动机。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:23502

  • 我在表中为某些列设置了默认值。例如,create_time我已经设置了CURRENT_TIMESTAMP。当我通过JPA插入一个对象时,我没有得到该列的默认值。是否有任何命令可以执行此操作?

  • 问题内容: 我正在使用phpMyAdmin建立数据库。我有两个表(和), 在它们的主键上建立了索引 。我正在尝试使用它们的主键作为外键在它们之间创建一个关系表()。 我将这些表创建为MyISAM,但是后来将这三个表都更改为InnoDB,因为我读到MyISAM不支持外键。所有字段均为。 当我选择表格时,单击“关系视图”链接,然后尝试将FK列设置为和,它显示 “未定义索引!” 每列旁边。 我想念什么?

  • 我有一个这样的实体: 多谢了,安德里亚

  • 在学习JPA/Hibernate时,我偶然发现了一些意想不到的事情。我得到了一个不必要的对db的双击查询(参见buttom)。我有一个简单的OneToOne设置。 这是我的联系人: 我的地址实体: 这就是我运行代码的方式: 这可能是愚蠢的事情,但是什么导致了双重选择? 注意:My EntityManagerFactoryCreator是调用

  • 父级 子 在数据库子表中有一列ParentId->典型的一个(父)->多个(子)关系 现在我创建了两个实体 null 我总是需要同时创建密钥OneToMany和ManyToOne的两个部分吗?还是我可以只创建ManyToOne,而不关心我有孩子的父对象? 什么会导致Hibernate给我一条消息,即没有子级的父级违反外键约束?