2012-02-27 65 views
0

错误: 引起:org.hibernate.AnnotationException:未知mappedBy in:com.xxx.data.dao.classes.Categories.categoriesLang,引用属性unknown:com.xxx .data.dao.classes.superclasses.CategoriesLang.categories@MappedSuperClass in Hibernate = AnnotationException:Unknown mappedBy

我的设置:

的Hibernate 3.5.6

public interface CategoriesLangInt { 

    int id_categories = 0; 
    Categories categories = null; 
    String name = ""; 
    String description = ""; 

    int getId_categories(); 

    void setId_categories(int id_categories); 

    Categories getCategories(); 

    void setCategories(Categories categories); 

    String getName(); 

    void setName(String name); 

    String getDescription(); 

    void setDescription(String description); 
} 

@MappedSuperclass 
public abstract class CategoriesLang implements CategoriesLangInt { 

    @Id 
    @Column(name = "id_categories") 
    private int id_categories = 0; 
    @OneToOne 
    @JoinColumn(name = "id_categories") 
    private Categories categories; 
    @Size(max = 50) 
    private String name = ""; 
    @Size(max = 350) 
    private String description = ""; 

    @Override 
    public int getId_categories() { 
     return id_categories; 
    } 

    @Override 
    public void setId_categories(int id_categories) { 
     this.id_categories = id_categories; 
    } 

    @Override 
    public Categories getCategories() { 
     return categories; 
    } 

    @Override 
    public void setCategories(Categories categories) { 
     this.categories = categories; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String getDescription() { 
     return description; 
    } 

    @Override 
    public void setDescription(String description) { 
     this.description = description; 
    } 

} 

@Entity 
@Table(name="categories") 
public class Categories implements Serializable { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id_categories; 
    private boolean active; 
    @OneToOne(mappedBy="categories") 
    private CategoriesLangInt categoriesLangInt; 

    public Integer getId_categories() { 
     return id_categories; 
    } 

    public void setId_categories(Integer id_categories) { 
     this.id_categories = id_categories; 
    } 

    public boolean isActive() { 
     return active; 
    } 

    public void setActive(boolean active) { 
     this.active = active; 
    } 

    public CategoriesLangInt getCategoriesLangInt() { 
     return categoriesLangInt; 
    } 

    public void setCategoriesLangInt(CategoriesLangInt categoriesLangInt) { 
     this.categoriesLangInt = categoriesLangInt; 
    } 

} 

UPDATE解决它!

经过很长时间的研究,最终我成功了。它工作正常!

EER

@Entity 
@Table(name="categories") 
public class Category implements Serializable { 

    private Integer id; 
    private boolean active; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public boolean isActive() { 
     return active; 
    } 

    public void setActive(boolean active) { 
     this.active = active; 
    } 

} 

public interface CategoryInt{ 

    int getCategory_id(); 

    void setCategory_id(int category_id); 

    String getName(); 

    void setName(String name); 

    String getDescription(); 

    void setDescription(String description); 

    void setCategory(Category category); 

    Category getCategory(); 
} 

@MappedSuperclass 
public abstract class CategoryLang implements CategoryInt{ 

    private int category_id; 
    private String name; 
    private String description; 
    private Category category; 

    @Override 
    @Id 
    public int getCategory_id() { 
     return category_id; 
    } 

    @Override 
    public void setCategory_id(int category_id) { 
     this.category_id = category_id; 
    } 

    @Override 
    @Size(max = 50) 
    public String getName() { 
     return name; 
    } 

    @Override 
    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    @Size(max = 350) 
    public String getDescription() { 
     return description; 
    } 

    @Override 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    @Override 
    @OneToOne(cascade = CascadeType.ALL) 
    @PrimaryKeyJoinColumn 
    public Category getCategory() { 
     return category; 
    } 

    @Override 
    public void setCategory(Category category) { 
     this.category = category; 
    } 
} 

@Entity 
@Table(name = "en_categories") 
public class CategoryEN extends CategoryLang implements Serializable {} 

@Entity 
@Table(name = "es_categories") 
public class CategoryES extends CategoryLang implements Serializable {} 

回答

1

首先,接口可以不定义字段,但只有方法。您在界面中声明的字段实际上是公共静态最终常量。

后,分类实体具有CategoriesLangInt领域,但Hibernate有没有办法知道哪一个实体此字段表示,因为有可能是实现此接口的几个实体。您必须使用OneToOne批注的targetEntity属性来告诉Hibernate引用了哪个实体。

最后,在CategoriesLang的id_categories列映射两次:一次作为一个ID,并且一旦作为JoinColumn。您必须删除id_categories场,并与@Id注释categories场,或保留id_categories领域,因为它是和@MapsId注释添加到categories

旁注:你应该尊重的Java命名约定(在属性和方法没有下划线),并重新命名类别来分类,CategoriesLang到CategoryLang等

+0

非常感谢您Nizet。 – Dani 2012-02-29 10:34:01

0

我想这是因为你在你的领域超(界面,在这里)通过在扩展类类似命名的阴影领域。尝试从界面中删除这些字段(如类别)。