@MappedSuperClass في السبات = AnnotationException:غير معروف MappedBy
-
13-11-2019 - |
سؤال
خطأ:حدث بسبب:org.hibernate.AnnotationException:غير معروف MappedBy في: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 {}
المحلول
أولًا، قد لا تحدد الواجهة الحقول، بل الأساليب فقط.الحقول التي أعلنتها في الواجهة هي في الواقع ثوابت نهائية عامة ثابتة.
بعد ذلك، يحتوي كيان الفئات على حقل CategoriesLangInt، ولكن ليس لدى Hibernate طريقة لمعرفة الكيان الذي يمثله هذا الحقل، حيث قد يكون هناك العديد من الكيانات التي تطبق هذه الواجهة.يجب عليك استخدام targetEntity
سمة التعليق التوضيحي OneToOne لإخبار Hibernate بالكيان المشار إليه.
وأخيرا، فإن id_categories
تم تعيين العمود في CategoriesLang مرتين:مرة واحدة كمعرف، ومرة واحدة كـ JoinColumn.يجب عليك إما إزالة id_categories
الحقل والتعليق على categories
الحقل مع @Id، أو المغادرة id_categories
الحقل كما هو وأضف التعليق التوضيحي @MapsId إليه categories
.
ملاحظة جانبية:يجب عليك احترام اصطلاحات تسمية Java (لا توجد شرطة سفلية في الحقول والأساليب)، وإعادة تسمية الفئات إلى فئة، ومن الفئات لانج إلى فئة لانج، وما إلى ذلك.
نصائح أخرى
أعتقد أنه لأن حقولك في Superclass (الواجهة، هنا) مظللة عن طريق الحقول المسماة بالمثل في الفصل الممتد.حاول إزالة هذه الحقول من الواجهة (مثل الفئات).