java - java中对象的接口(interface)类型映射

标签 java jpa hibernate-mapping persistence.xml

我有以下代码

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一次可以申请一笔贷款。 如何将可借类型对象映射到数据库?我在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;
}
<小时/>

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

关于java - java中对象的接口(interface)类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50551884/

相关文章:

postgresql - Glassfish 4 和 Postgres ConnectionPool 上的 JSF 2.2 + EJB 3 + JPA

java - 在引用管理表 hibernate 的用户表上插入值 1

java - 保存了超过 10 个项目的 ArrayList 未排序到数据库

java - hibernate 将多列映射到 arraylist

java - 如何将动态编译的字节重新编码为文本?

java - 基于不同服务构建请求的最佳方式/模式

java long 数据类型转换为无符号值

java - 映射仅由不带 @IdClass 或 @EmbeddedId 的复合 PK 组成的类

java - 是否可以配置 hibernate 以忽略 hibernate.cfg.xml 文件中缺少的资源?

java - 随机检查数组列表中的对象