我有这样的情况: 有几组POJO类,每组都有一个父类。每个组用于处理一些数据记录 - 在JAXB的帮助下到XML,在Hibernate的帮助下到数据库。我的工作代码的简化版本是:
public static abstract class Habit{
String habitName;
/* constructors */
/* getter & setter */
}
@Entity
@Access(AccessType.PROPERTY)
@Table(name = "habit")
public static class DBHabit extends Habit{
@Id
@GeneratedValue
private int id;
@Column(name = "habit_name")
public String getHabitName() {
return habitName;
}
public void setHabitName(String habitName) {
this.habitName = habitName;
}
}
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "habit")
public static class XmlHabit extends Habit{
@XmlElement
public String getHabitName() {
return habitName;
}
public void setHabitName(String habitName) {
this.habitName = habitName;
}
}
public static abstract class Person{
int age;
String name;
List<Habit> habits;
/* Constructor */
/* Getters & Setters */
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Habit> getHabits() {
return habits;
}
public void setHabits(List<Habit> habits) {
this.habits = habits;
}
}
@Entity
@Access(AccessType.PROPERTY)
@Table(name = "person")
public static class DBPerson extends Person{
@Id
@GeneratedValue
private int id;
@Column(name = "age")
@Override
public int getAge() {
return age;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Column(name = "name")
@Override
public String getName() {
return name;
}
@Override
public void setName(String name) {
this.name = name;
}
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, targetEntity = DBHabit.class)
@Override
public List<Habit> getHabits() {
return habits;
}
@Override
public void setHabits(List<Habit> friends) {
this.habits = habits;
}
}
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "", propOrder = {
"age",
"name",
"habits"
})
@XmlRootElement(name = "state")
public static class XmlPerson extends Person{
@Override
@XmlElement(required = true)
public int getAge() {
return super.getAge();
}
@Override
public void setAge(int age) {
super.setAge(age);
}
@Override
@XmlElement(required = true)
public String getName() {
return super.getName();
}
@Override
public void setName(String name) {
super.setName(name);
}
@Override
@XmlElement(required = true)
@XmlElementWrapper(name = "friends")
public List<Habit> getHabits() {
return super.getHabits();
}
@Override
public void setHabits(List<Habit> habits) {
super.setHabits(habits);
}
}
我在使用Hibernate时遇到问题。以为我写的是我希望在targetEntity中记录DBHabit.class,hibernate不会记录任何有关习惯的信息,这个表总是空的。 请给我一个提示,我可以在这种情况或建议中做些什么,如何以不同的方式为写作制作类似的抽象系统。 谢谢你的关注!
答案 0 :(得分:0)
我在你的地图中注意到了一些奇怪的事情:
@OneToOne
映射,由List<Habit>
支持。为什么不直接习惯?@Access(AccessType.PROPERTY)
注释了类,但是您将映射注释放在访问器方法上(您可能会从那里发出问题)。相反,您可以尝试将父抽象类注释为@MappedSuperclass
。这样,您就不必重新定义访问者。或者,如果您不希望在父类中添加hibernate注释,请删除@Access(AccessType.PROPERTY)
注释。