Я использую Play Framework 2.4. Я хочу, чтобы моделировать набор классов с этой цепочки наследования:Модельный класс, используемый как тип поля сам по себе, вызывает ошибку в Ebean
Research <- Publication <- Article
Проблема заключается в том, я хотел бы класс публикации ссылаться на другие объекты этого класса, как это:
@MappedSuperclass
public abstract class Research extends Model {
@Id
public Long id;
}
@Entity
public class Publication extends Model {
@ManyToOne
public Publication translationOf;
}
Это работает, когда я не наследую от публикации. Когда я добавить наследуя из статьи:
@MappedSuperclass
public abstract class Publication extends Model {
@ManyToOne
public Publication translationOf;
}
@Entity
public class Article extends Publication { }
я получаю:
java.lang.RuntimeException: Error with association
to [class models.research.Publication]
from [models.research.publication.Article.translationOf].
Is class models.research.Publication registered?
Я подумал, что, возможно, конфигурировании InheritanceType
в явной форме поможет, но добавление @Inheritance
тега вызывает NullPointerException
без каких-либо других информационных вложенных исключений в трассировки стека. Это происходит, например, в этом случае:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype", discriminatorType = DiscriminatorType.STRING)
public abstract class Research extends Model {
@Id
public Long id;
public String dtype;
}
@Entity
@DiscriminatorValue("P")
public class Publication extends Model {
@ManyToOne
public Publication translationOf;
}
Благодарим вас за ответ. Ваш код работает. Однако я не хочу, чтобы «Article» наследовал «Исследование». Он должен унаследовать от «Публикации» (существуют разные публикации, такие как статьи и книги, которые могут ссылаться друг на друга). Вот почему в моем втором примере кода я изменяю аннотацию 'Публикации' на' @ MappedSuperclass'. Добавление класса 'Article', который наследуется от' Publication' вызывает 'java.lang.RuntimeException: ошибка с ассоциацией с [class models.research.Publication] из [models.research.publication.Article.referencedBy]. Является ли класс models.research.Publication зарегистрированным? ' – nuoritoveri
@nuoritoveri.' MappedSuperClass' - это класс, содержащий поля, которые унаследуют от каждого '@ Entity', который наследуется от него. Это не модель в базе данных, и поэтому вы не можете ссылаться на нее с помощью аннотации '@ ManyToOne' или' @ OneToMany'. Если вы хотите связать статью с публикацией, публикация должна быть '@ Entity'. Ebean позаботится о создании поля 'publication_id' в таблице статей. –
Я не мог заставить наследование работать, поэтому я решил использовать композицию вместо наследования ('Article',' Book' и т. Д. Имеют поле '@ OneToOne' типа' Publication'). Ваш ответ помог мне установить отношение '@ ManyToMany'. Большое спасибо! – nuoritoveri