java - 在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
人一次可以贷款一笔。如何将可借类型对象映射到数据库?我搜索了创建抽象类并在Book
and中扩展它的方法DigitalMedia
,但是我不能扩展两个类,因为它们已经扩展了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;
}
Loan
和之间的关联Loanable
是多对多的。这是因为虽然一种材料一次只能借给一个学生,但它可以在不同时间借给多个学生。同样,虽然一个学生一次只能借出一种材料,但同一个学生可以在不同时间借出许多材料。Loan
因此,从to的关联User
也应该ManyToOne
如此。
推荐阅读
- javascript - 条带 unit_amount 定制费用在快递中出现错误 TypeError:无法读取未定义的属性
- python - 如何从python中的字符串中减去整数?
- python - 如果使用枚举相同,如何删除相邻的字母?
- c++ - 为什么函数返回垃圾值,包括实际输出以及如何清除这些垃圾?
- java - 在或条件之一为假后,执行while循环
- image - 如何通过从不同颜色空间中提取 4 个通道来制作 4 个通道图像?
- javascript - JWT 来自一个网站的无效签名,但另一个网站没有错误。用户对象的额外属性被添加到令牌
- docker - Docker 服务需要在容器创建后重启或重启才能通过暴露端口访问
- r - 从包含 R 中空字符串的 tibble 中删除行?
- .htaccess - 使用 .htacesss 将 domain/* 重定向到 index.html