【问题标题】:Entity Mapping with One to One and One to Many Java/JPA/HibernateJava/JPA/Hibernate 一对一和一对多的实体映射
【发布时间】:2020-08-16 23:33:15
【问题描述】:

在实体映射方面需要帮助。我有 Debtor 实体,它与 Addresses 实体有一对多的映射。 我也有不同的地址类型,债务人应该与每种地址类型进行一对一的映射。 每个地址类型都是地址的子类。在运行测试用例时,我遇到了错误

"为类inquiry.entity.CurrentAddress 提供了错误类型的ID。预期:类java.lang.Integer,得到类 java.lang.String;嵌套异常是 java.lang.IllegalArgumentException:"

谁能帮忙,如何映射实体。

@Entity
@Table(name="debtors")
public class Debtor{

    @Id
    @Column(name = "id" , length = 127)
    private String id;

    @OneToOne
    @JoinColumn(name = "id", referencedColumnName = "parent_id")
    private CurrentAddressStd currAddrStd;

    @OneToOne
    @JoinColumn(name = "id", referencedColumnName = "parent_id")
    private CurrentAddress currAddr;

    @OneToMany
    @JoinColumn(name = "parent_id")
    private List<Addresses> addresses;

    

}

@Entity
@Table(name="addresses")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type")
public class Addresses{
    @Id
    @GeneratedValue(strategy= GenerationType.SEQUENCE)
    private int id;

@Any(metaColumn = @Column(name = "parent_type"))
    @AnyMetaDef(idType = "string", metaType = "string",
            metaValues = {
                    @MetaValue(targetEntity = Contact.class, value = "Contact"),
                    @MetaValue(targetEntity = Debtors.class, value = "Debtor"),
                    
            })

    @JoinColumn(name = "parent_id")
    public Object parentItem;
}

@Entity
@DiscriminatorValue("CurrAddrStd")
public class CurrentAddressStd extends Addresses{

}

public interface AddressesRepository extends CrudRepository<Addresses,Integer> {
}

【问题讨论】:

  • 嗨@dharan,我的回复有帮助还是您仍然收到错误消息?

标签: java hibernate jpa


【解决方案1】:

在您的 Debtor 课程中,您有这个:

@OneToOne
@JoinColumn(name = "id", referencedColumnName = "parent_id")
private CurrentAddress currAddr;

@OneToOne 告诉 Hibernate,在 Debtor 类本身中找到了外键,列名为“id”,即String。在映射回AddressesCurrentAddress 类中,您有一个@Id 字段,即intHibernate 无法将 int 主键与 String 外键匹配,这会导致您遇到错误。

取自hereJoinColumn注解的name属性的定义:

(可选)外键列的名称。找到它的表取决于上下文。

如果联接是针对使用外键的 OneToOne 或 ManyToOne 映射 映射策略,外键列在源表中 实体或嵌入。

【讨论】:

  • @jumping_monkey- 感谢您的回答。我知道它是由于不同的类型而失败的。有没有办法解决这个问题,目前我无法更改数据库架构,因为我们正在将旧系统迁移到新的技术堆栈。
  • @dharan,你能告诉我这门课inquiry.entity.CurrentAddress吗?
  • @jumping_money- 我已经在代码中添加了它。它只是扩展地址实体
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多