Я относительный новичок в JPA, и я читал книги (Java Persistence с Hibernate, Pro JPA 2 - Освоение API Java Persistence), выполнил поиск в Google, но мне не удалось найти решение в следующей ситуации.
У меня есть базовый класс History, который содержит всю постоянную информацию, необходимую для хранения членов данных класса в базе данных. Однако у класса есть абстрактный метод, который необходимо переопределить в производных классах. Производные классы не имеют никакой собственной информации о постоянстве. Они существуют исключительно по двум причинам:
- для уникальной реализации абстрактного метода, определенного в базе
Класс истории
- чтобы сохранить данные в своей собственной таблице
Код ниже должен прояснить это.
@??? What annotation should I use here?
public abstract class History
{
@Id @GeneratedValue
private int id; // primary key
@Lob @Column(columnDefinition="mediumtext", length=65535)
protected String string; // string containing history
public abstract String foo();
}
@Entity
@Table(name="derived_history_1")
public class Derived1 extends History
{
public String foo()
{
return "Hello";
}
}
@Entity
@Table(name="derived_history_2")
public class Derived2 extends History
{
public String foo()
{
return "World";
}
}
Я не думал, что @Inheritance (стратегии = InheritanceType.JOINED) имеет смысл, потому что ничто не наследуется в производных классах, которые должны быть постоянными.
Я пробовал @MappedSuperclass, но тогда CascadeType.PERSIST и CascadeType.MERGE не работали, когда производные классы были членами данных другого класса. Например,
@Entity
@Table(name="part")
public class Part
{
...
@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}, optional=false, fetch=FetchType.LAZY)
@JoinColumn(name="history_id") // foreign key into history_part table
protected Derived1 history;
}
Так что я не мог найти ничего, что бы сработало и соответствовало моей ситуации.
Я надеюсь, что объясняю это достаточно хорошо, чтобы люди могли понять.
Кто-нибудь знает, как это сделать, это не полный и полный взлом :-)
Спасибо за любую помощь.