java 中对象的映射接口类型

Mapping interface type of objects in java

我有以下代码

interface Loanable {}

abstract class Material {}

@Entity
class Journal extends Material {}

@Entity
class Book extends Material implements Loanable {}

@Entity
class DigitalMedia extends Material implements Loanable {}

@Entity
@Table(name = "Loan")
@Access(value = AccessType.FIELD)
public class Loan {
    @Id
    @Column(name="Loan_ID",updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @OneToOne (cascade=CascadeType.ALL)
    @JoinColumn(name="studentId")
    /* Person who makes the loan */
    private User user;

    //@Column(name="loanable")
    @OneToOne (cascade=CascadeType.ALL)
    @JoinColumn(name="materialId")
    /* Loanble which is loaned */
    private Loanable loanable;
}

如代码所示,我正在尝试将 Loan 映射到 Loanable。一个 User 一次可以借一笔钱。 如何将loanable类型的对象映射到数据库中?我搜索了制作抽象的方法class并将其扩展到BookDigitalMedia,但我不能扩展两个 class,因为它们已经扩展了 Material@Convert 似乎也不适用于对象的接口类型。我正在使用具有 Hibernate 持久性的 JPA。

JPA 实体需要 类,因此尝试映射接口是行不通的。映射 类 不一定是具体的,因此抽象 类 与关联一起工作。

以下应该有效:

@MappedSuperclass
abstract class Material {}

@MappedSuperclass
abstract class LoanableMaterial extends Material implements Loanable {}

@Entity
class Journal extends Material {}

@Entity
class Book extends LoanableMaterial {}

@Entity
class DigitalMedia extends LoanableMaterial {}

@Entity
class Loan {
  @ManyToOne(targetEntity = LoanableMaterial.class)
  LoanableMaterial loaned;
}

LoanLoanable 之间的关联是多对多的。这是因为虽然一个 material 一次只能借给一个学生,但它可以在不同时间借给多个学生。同样,虽然一个学生一次只能借出一个 material,但同一个学生可以在不同时间借出许多 material。因此,从 LoanUser 的关联也应该是 ManyToOne