Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate继承-具有2个扩展父类的OneToMany不起作用_Java_Hibernate_Spring Data - Fatal编程技术网

Java Hibernate继承-具有2个扩展父类的OneToMany不起作用

Java Hibernate继承-具有2个扩展父类的OneToMany不起作用,java,hibernate,spring-data,Java,Hibernate,Spring Data,我有3个实体: @Data @AllArgsConstructor @Entity @Table(name = "beneficiary") @Inheritance @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type") public abstract class Beneficiary { public Beneficiary() {} @Id p

我有3个实体:

@Data
@AllArgsConstructor 
@Entity 
@Table(name = "beneficiary") 
@Inheritance 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type") 
public abstract class Beneficiary {   
    public Beneficiary() {}

      @Id private String id;

      private String description; 
}


@Data
@Entity
@DiscriminatorValue("company")
@EqualsAndHashCode(callSuper = true)
public class BeneficiaryCompany extends Beneficiary {
  public BeneficiaryCompany() {
    super();
  }

  public BeneficiaryCompany(String id, String description) {
    super(id, description);
  }
}


@Data
@Entity
@DiscriminatorValue("person")
@EqualsAndHashCode(callSuper = true)
public class BeneficiaryPerson extends Beneficiary {
  public BeneficiaryPerson() {}

  public BeneficiaryPerson(String id, String description) {
    super(id, description);
  }
}
在另一个类中,我希望有两个单独的集合:

@Data
@AllArgsConstructor
@Entity
@Table(name = "transaction")
public class Transaction {

  public Transaction() {}

  @Id private String id;

  private String description;

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = BeneficiaryCompany.class)
  @JoinColumn(name = "transaction_id", nullable = false)
  private Set<BeneficiaryCompany> beneficiaryCompanies;

  @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true,targetEntity = BeneficiaryPerson.class)
  @JoinColumn(name = "transaction_id", nullable = false)
  private Set<BeneficiaryPerson> beneficiaryPeople;
}
@数据
@AllArgsConstructor
@实体
@表(name=“交易”)
公共类事务{
公共事务(){}
@Id私有字符串Id;
私有字符串描述;
@OneToMany(cascade=CascadeType.ALL,orphanRemoving=true,targetEntity=受益人公司.class)
@JoinColumn(name=“transaction\u id”,nullable=false)
私人设定受益公司;
@OneToMany(cascade=CascadeType.ALL,orphanRemoving=true,targetEntity=受益人类型person.class)
@JoinColumn(name=“transaction\u id”,nullable=false)
私人受益人;
}
问题是每个受益人都被带到了受益人公司,调试器中的受益人告诉我:

无法计算抛出的表达式方法 “org.hibernate.ErrorClassException”异常

数据库记录看起来很好(已创建DiscriminatorColumn)。有什么问题吗?为什么受益人公司包含受益人个人对象

@编辑: 为了获取记录,我正在使用SpringData JPA存储库

在基类上使用
@MappedSuperclass

亚历山大·彼得罗夫是绝对正确的。您必须删除
@Entity
,因为超类不是实体。在处理继承扩展类时,您可以在基类上使用
@MappedSuperclass
注释,在您的情况下,它是
受益人

编辑:
是一篇非常好的文章,您可以参考。

尝试从抽象类中删除@Entity作为开始。Ity不是一个实体。@Alexandar您确定我应该删除它吗?我发现了它,可能不完全是我得到的(比如不同的继承类型),但Vlad使用实体。第二个问题是当我使用实体时,没有为实体指定标识符:受益人公司是的,我确定。在他的例子中,超类不是抽象的,因此它是一个有效的实体。在你的情况下,它是抽象的,因此它不是。它永远不可能单独实例化。所以它仍然不起作用吗?是的,不幸的是,与我读到的一样,我不能只使用一个表来存储实体并使用hibernate区分子类(或者我错了?)。我在问题中没有提到这一点。现在,我可以尝试使用继承注释并寻找其他解决方案,但若找不到解决方案,我将使用MappedSuperclass。谢谢你的回复:)这取决于你如何想象你的最终结果。请分享你想要的DDL,我会尽我所能帮助你。我会简化它一点(只描述几列)。我希望有一个表,其中包含像ID、transactionId、startDate、受益人类型这样的数据-这些值由受益人类型人员和受益人公司使用。此表包含仅由受益人yperson使用的personId(对于表中的受益人公司,设置为null),受益人公司-受益人yperson的CompanyDescription将此值设置为null。所以-我只想要一个表-方便DB开发人员维护(还有更多的原因,我对它没有影响)。这就是你想要的:我想我已经在我的问题帖子中实现了这一点-然而,问题是在类事务中,我有2个OneToMany集,每个记录,即使不是有益的公司(比如说受益人)它转到受益人公司集合(受益人公司集合抛出我问题中描述的异常)。我不知道这是Hibernate错误,或者我只是犯了一个愚蠢的错误。无论如何,非常感谢你的回答Ilya!