2012-02-27 41 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

我想這是因爲你在你的領域超(界面,在這裏)通過在擴展類類似命名的陰影領域。嘗試從界面中刪除這些字段(如類別)。