首页 > 解决方案 > 在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;
}

如代码所示,我正在尝试映射LoanLoanable. 一个User人一次可以贷款一笔。如何将可借类型对象映射到数据库?我搜索了创建抽象类并在Bookand中扩展它的方法DigitalMedia,但是我不能扩展两个类,因为它们已经扩展了Material@Convert似乎也不适用于接口类型的对象。我正在使用具有 Hibernate 持久性的 JPA。

标签: javajpahibernate-mappingpersistence.xml

解决方案


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;
}

Loan和之间的关联Loanable是多对多的。这是因为虽然一种材料一次只能借给一个学生,但它可以在不同时间借给多个学生。同样,虽然一个学生一次只能借出一种材料,但同一个学生可以在不同时间借出许多材料。Loan因此,从to的关联User也应该ManyToOne如此。


推荐阅读