Hibernate 中的@MappedSuperClass = AnnotationException:未知的映射者
-
13-11-2019 - |
题
错误:造成原因:org.hibernate.AnnotationException:未知的映射者:com.xxx.data.dao.classes.Categories.categoriesLang,引用的属性未知:com.xxx.data.dao.classes.superclasses.CategoriesLang.categories
我的设置:
休眠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;
}
}
更新 解决了!
经过很长时间的研究,我终于成功了。效果很好!
@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 {}
解决方案
首先,接口可能不定义字段,而只能定义方法。您在接口中声明的字段实际上是公共静态最终常量。
之后,Categories 实体有一个 CategoryLangInt 字段,但 Hibernate 无法知道该字段代表哪个实体,因为可能有多个实体实现该接口。您必须使用 targetEntity
OneToOne 注释的属性告诉 Hibernate 引用了哪个实体。
最后, id_categories
CategoriesLang 中的列被映射两次:一次作为 ID,一次作为 JoinColumn。您必须删除 id_categories
字段并注释 categories
带 @Id 的字段,或离开 id_categories
字段按原样添加 @MapsId 注释 categories
.
边注:您应该遵守Java命名约定(字段和方法中没有下划线),并将Categories重命名为Category,将CategoriesLang重命名为CategoryLang等。
其他提示
我认为它是因为您的超类中的字段(此处,这里)被扩展类中的类似指定字段遮蔽。尝试从接口中删除这些字段(如类别)。
不隶属于 StackOverflow