Java Hibernate继承-具有2个扩展父类的OneToMany不起作用
我有3个实体: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
@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!