2015-07-29 19 views
0

Я получаю эту ошибку, когда буду persist() мое лицо. Я думаю, что причиной ошибки является отношение, моя идея заключается в том, что FolderEntity (представляет собой виртуальную папку) может оставаться внутри другого (только один). Затем я создал ссылку на self (в расширенном классе, поскольку все ресурсы могут быть внутри папки, и папка является ресурс)JPA Entity field reference OneToOne recursive

org.hibernate.AnnotationException: Referenced property not a (One|Many)ToOne: com.editor.entity.FolderEntity.id in mappedBy of com.editor.entity.FolderEntity.folderId 

Это мой главный Entity:

@MappedSuperclass 
public abstract class Entity implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", nullable = false) 
    private Integer id; 

    /** getter/setter **/ 

} 

Тогда я расширяю его в моем ResourceEntity Entity:

@MappedSuperclass 
public class ResourceEntity extends Entity { 

    @Column(name = "NAME", length = Lengths.NAME40, unique = true, nullable = false) 
    private String name; 

    @Column(name = "DESCRIPTION", length = Lengths.DESCRIPTION1000, unique = false, nullable = true) 
    private String description; 

    @JoinColumn(name = "FOLDER_ID", updatable = true, nullable = false) 
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "id") 
    private FolderEntity folderId; 

    /** getter/setter **/ 

} 

Наконец, я работаю с этой организацией:

@javax.persistence.Entity 
@Table(name = "EDITOR_FOLDERS") 
@NamedQueries({ 
     @NamedQuery(name = FolderEntity.ALL_FOLDERS, query = "select f from FolderEntity f"), 
     @NamedQuery(name = FolderEntity.FOLDER_BY_NAME, query = "select f from FolderEntity f where name = :name and resourceType = :resourceType") }) 
public class FolderEntity extends ResourceEntity { 


    public static final String ALL_FOLDERS = "findAllFolders"; 
    public static final String FOLDER_BY_NAME = "findAllFoldersByName"; 

    @Column(name = "RESOURCE_TYPE", length = Lengths.CODE, unique = false, nullable = false) 
    private Integer resourceType; 
    /** getter/setter **/ 

} 

Anybodys помочь мне решить эту проблему? Благодаря!

+0

У вас нет ассоциации @ @ OneToOne здесь, но '@ ManyToOne'. В конце концов, ** много ** ресурсов могут находиться внутри ** одной папки **. – manish

ответ

2

Вы должны проверить значение mappedBy: Он не ссылается на поле, содержащее идентификатор (JPA достаточно умен, чтобы найти, что один сам по себе), но он ссылается на другой XToOne поле, которое «принадлежит» отображение

общественного аннотация Строка mappedBy

(Необязательно) поле, которое имеет отношения. Этот элемент указан только на обратной (не принадлежащей стороне) стороне ассоциации.

(от Javadoc из OneToOne)

В вашем случае вам не нужен mappedBy, как вы на стороне имущего. И вы должны называть атрибут folder, поскольку вы ссылаетесь на ID, но на объект.

Еще одно замечание: Используйте enum для resourceType если вы намерены определить возможные значения в приложении как константы.