Отображение типа интерфейса объектов в Java - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующий код

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, но не могу 't расширяют два класса, так как они уже расширяют Material.@Convert также, похоже, не работает с интерфейсом типа объектов.Я использую JPA с сохранением Hibernate.

1 Ответ

0 голосов
/ 27 мая 2018

Объекты 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 до User должна быть также ManyToOne.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...