Question

Erreur:Causé par: org.hibernate.annotationxception: inconnu mappé par: com.xxx.data.dao.classes.categories.categorieslang, propriété référencée inconnue: com.xxx.data.dao.classes.superclasses.categorieslang.categories

Ma configuration:

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;
    }

}

METTRE À JOUR RÉSOLU!!!

Après une longue période de recherche à la fin, je réussis. Ça fonctionne bien!

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 {}
Était-ce utile?

La solution

Tout d'abord, une interface peut ne pas définir les champs, mais seulement les méthodes. Les champs que vous avez déclarés dans l'interface sont en fait des constantes finales statiques publiques.

Après, l'entité des catégories a un champ Catégorieslangint, mais Hibernate n'a aucun moyen de savoir quelle entité ce champ représente, car il pourrait y avoir plusieurs entités implémentant cette interface. Vous devez utiliser le targetEntity Attribut de l'annotation Onetoone pour dire à l'hibernate quelle entité est référencée.

Finalement, le id_categories La colonne dans catégoriesLang est mappée deux fois: une fois en tant qu'identifiant, et une fois en tant que joincomn. Vous devez soit supprimer le id_categories champ et annoter le categories champ avec @id, ou partir id_categories champ tel quel et ajouter l'annotation @mapsid à categories.

Note latérale: vous devez respecter les conventions de dénomination de Java (pas de soulignement dans les champs et les méthodes), et renommer les catégories à la catégorie, catégorieslang à catégorielang, etc.

Autres conseils

Je pense que c'est parce que vos champs dans votre superclasse (interface, ici) sont ombragés par des champs nommés de manière similaire dans la classe d'extension. Essayez de supprimer ces champs de l'interface (comme les catégories).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top