映射 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一次可以有一笔贷款。如何将可借出类型对象映射到数据库?我搜索了制作抽象类的方法,并在BookDigitalMedia中扩展它,但我不能扩展两个类,因为它们已经扩展了Material@Convert似乎也不适用于对象的接口类型。我正在使用带有休眠持久性的 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之间的关联是多对多的。这是因为虽然一种材料一次只能借给一个学生,但它可以在不同的时间借给多个学生。同样,虽然一个学生一次只能借出一种材料,但同一个学生可以在不同的时间借出许多材料。因此,从LoanUser的关联也应ManyToOne

相关内容

最新更新