2017-06-15 30 views
0

我有这样的情况: 有几组POJO类,每个都有一个父类。每个小组都负责处理一些数据记录 - 在JAXB的帮助下将XML转换为XML,并在Hibernate的帮助下转换成数据库。我的工作代码的简化版本是:为什么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

一对夫妇的奇怪的事情我在映射注意:

  • 一个@OneToOne映射,由List<Habit>支持。为什么不直接习惯?
  • 您用@Access(AccessType.PROPERTY)注解类,但是随后您将映射注释放在访问器方法上(问题可能来自那里)。

相反,您可以尝试将父抽象类标注为@MappedSuperclass。这样,您不必重新定义访问者。或者,如果您不希望将休眠注释置于父类中,请删除@Access(AccessType.PROPERTY)注释。

相关问题