为什么hibernate不会在表中写入任何信息?

时间:2017-06-15 11:19:11

标签: java hibernate

我有这样的情况: 有几组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不会记录任何有关习惯的信息,这个表总是空的。 请给我一个提示,我可以在这种情况或建议中做些什么,如何以不同的方式为写作制作类似的抽象系统。 谢谢你的关注!

1 个答案:

答案 0 :(得分:0)

我在你的地图中注意到了一些奇怪的事情:

  • @OneToOne映射,由List<Habit>支持。为什么不直接习惯?
  • 您使用@Access(AccessType.PROPERTY)注释了类,但是您将映射注释放在访问器方法上(您可能会从那里发出问题)。

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