我有以下代码
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
一次可以申请一笔贷款。 如何将可借类型对象映射到数据库?我在Book
中搜索了制作抽象类并扩展它的方法。和DigitalMedia
,但我无法扩展两个类,因为它们已经扩展了 Material
。 @Convert
似乎也不适用于对象的接口(interface)类型。我将 JPA 与 Hibernate 持久性结合使用。
最佳答案
JPA 实体需要是类,因此尝试映射接口(interface)是行不通的。映射的类不一定是具体的,因此抽象类可以与关联一起使用。
以下应该有效:
@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
之间的关联是多对多的。这是因为,虽然一种 Material 一次只能借给一名学生,但它可以在不同时间借给多名学生。同样,虽然一名学生一次只能借出一份 Material ,但同一名学生可以在不同时间借出许多 Material 。因此,从 Loan
到 User
的关联也应该是 ManyToOne
。
关于java - java中对象的接口(interface)类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50551884/