2017-06-15 10 views
0

私はこのような状況にあります: POJOクラスのグループがいくつかあり、それぞれに親が1つあります。各グループは、JAXBの助けを借りて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)注釈を削除してください。

関連する問題