【问题标题】:Mapping interface type of objects in java在java中映射对象的接口类型
【发布时间】:2018-05-27 11:56:30
【问题描述】:

我有以下代码

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 似乎也不适用于接口类型的对象。我正在使用具有 Hibernate 持久性的 JPA。

【问题讨论】:

  • 提问时,请发布代码而不是描述您的代码,因为从实际代码中更容易理解问题。还要确保只发布与问题相关的尽可能多的代码,避免发布与问题无关的任何部分。
  • 只有部分 JPA 提供者支持接口。听起来您的 JPA 提供商没有

标签: java jpa hibernate-mapping persistence.xml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2010-11-03
    • 2021-02-03
    • 2017-11-26
    相关资源
    最近更新 更多