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

子实体中的JPA父外键为空

梁成双
2023-03-14

在一个双向关系中,我不能将子外键与父外键相关联。我有一个父类联盟是这样定义的:

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="id")
@Table(name="union_tb")
@Inheritance( strategy = InheritanceType.JOINED )     
public class Union extends User{

@Column(unique=true)
String Name;
float uniondue = 0;


@OneToMany(targetEntity=ServiceCharge.class,cascade=CascadeType.REMOVE, orphanRemoval=true,fetch = FetchType.EAGER,mappedBy="union")
List<ServiceCharge> ServiceCharges;
@OneToMany(targetEntity=Employee.class,cascade=CascadeType.REMOVE, orphanRemoval=true,fetch = FetchType.EAGER)
List<Employee> Employee;

public void PostServiceCharge(ServiceCharge charge) {
    ServiceCharges.add(charge);

}

子类ServiceCharge是这样定义的:

@Entity
@Table
 public class ServiceCharge implements Serializable{


@Id @GeneratedValue(strategy= GenerationType.AUTO)
int ChargeID;
String Service;
@Temporal(TemporalType.TIMESTAMP)
Calendar  TimeStamp;
float ChargeAmount;
@ManyToOne
@JoinColumn(name="union_id")
Union union;

public ServiceCharge(){super();}




public ServiceCharge(float chargeAmount, String service, String timestamp/*, Union union*/) throws ParseException {
    super();
    ChargeAmount = chargeAmount;
    Service = service;
    TimeStamp = TimeManagUtil.getGCobjectfromString(timestamp);
    //this.Union = union;
}

// getters and setters
}

然后运行测试代码:

    @Test
public void Test() throws Exception {
    ServiceCharge charge1 = new ServiceCharge(60,"service for employee","27/11/2016 20:35:00");
    Union u = new Union("Sindacate", 80);
    UnionController.add(u);
    ServiceController.add(charge1, u);
}

正如您所看到的,在将Union u持久化到数据库之后,我将这两个实体与一个控制器相关联,ServiceController.Add只是通过使用Union setter将实体charge1添加到servicecharges列表中,然后将该实体持久化到数据库中。

不过,测试走对了,但我只能看到这一点:

 | ChargeID | ChargeAmount | Service              | TimeStamp           | union_id |
 +----------+--------------+----------------------+---------------------+----------+
 |        6 |           60 | service for employee | 2016-11-27 20:35:00 |     NULL |
 |        7 |           10 | service for employee | 2016-11-27 20:45:00 |     NULL


 | Name      | uniondue | id |
 +-----------+----------+----+
 | Sindacate |       80 |  5 |
 +-----------+----------+----+

如您所见,union_id被设置为NULL。我做错了什么?

共有1个答案

宋洲
2023-03-14

尝试首先实例化union类,并在ServiceCharge的构造函数中初始化它。

@Test
public void Test() throws Exception {
    Union u = new Union("Sindacate", 80);
    UnionController.add(u);
    ServiceCharge charge1 = 
              new ServiceCharge(60,"service for employee","27/11/2016 20:35:00", u); // uncomment your parameter here that accepts Union class type.
    ServiceController.add(charge1, u);
}
 类似资料:
  • 我有两个表审查和bedrijfsgegevens。Review表有一个主键(reviewId)和一个外键(bedrijfId)。BedrijfId是Bedrijfsgegevens表中的主键(作为Id)。我遇到了这个问题,因为我试图在Review表中添加一个bedrijfId,而Bedrijfgegevens表中不存在这个行,因此得到了一个异常。 我尝试使用@manytoone和@joincolu

  • 我在表EmployeeCode的两列上有一个主键 主键(ecode,eid) 列eid是一个外键,它引用表Employee并具有ManytoOne映射,我已经在EmployeeCode.java中声明了如下内容 当我这样做时,我得到以下异常,因为我在这两个位置都使用了EID(因为它是另一个表的外键,也是复合主键的一部分) 我怎么能在两个地方都用同一个名字呢?

  • 我可能需要一些帮助,因为我被这些文件弄糊涂了: 我有一个JPA母公司: 和孩子: 如果我只是增加联系人,我希望JPA能够建立这种关系。 e、 g: 现在发生的是: 触点插入DB(良好) 使用providerX。联系人中的id。提供者列(良好) provider\u contact表中未显示任何关系条目 我知道我可以将联系人设置为提供者的属性<代码>providerX。联系人。添加(c)。。。回购。

  • 问题内容: 我有一个关于从子实体ir引用ParentEntities的问题,如果我有这样的事情: Parent.java: 和Child.java: 将创建以下表: 好的,到目前为止,一切都很好。但是,当涉及到使用Java的Reference时,我想,您可以做这样的事情。 这导致在数据库中: 但是事实并非如此,您必须明确地将“父级”设置为“子级”(我认为框架可能可以单独执行)。 因此,数据库中真正

  • 我有vehicleId和vehicleName的值,我想从这两个属性值中获取User对象。 我不想创建一个车辆存储库仅仅是为了找到用户对象,我知道可以通过创建一个车辆存储库来实现,它扩展了springdatajpa中的JPA存储库。

  • 我想将类的外键从列表映射到类的主键。实体框架在子问题中没有建立这种关系。 我的形式类。 我的问题课。 IEntityTypeConfiguration中的配置应该是什么样子?