JPA @Entity Inheritance - PullRequest
       14

JPA @Entity Inheritance

6 голосов
/ 30 мая 2011

Я уже некоторое время изучаю наследование JPA / Hibernate @Entity и, похоже, не могу найти ничего, что касалось бы того, чего я пытаюсь достичь.

По сути, я хочу иметь возможность определить@Entity со всеми сопоставлениями столбцов и таблиц, как требуется.Затем я хочу иметь возможность расширять @Entity в нескольких разных местах с помощью различных наборов @Transient методов, определенных в теле каждого "подобъекта".Это основной пример того, чего я пытаюсь достичь, но пока безуспешно:

@Entity
@Table(name = "mountain")
public class MountainEntityBase implements Serializable {
    public Integer mountainId = 0;
    public Integer height = 0;

    public List<ExplorerEntityBase> explorers = new ArrayList<ExplorerEntityBase>();

    @Id
    @GeneratedValue
    @Column(name = "mountain_id")
    public Integer getMountainId() { return mountainId; }
    public void setMountainId(Integer mountainId) { this.mountainId = mountainId; }

    @Column(name="height")
    public String getHeight() { return height; }
    public void setHeight(String height) { this.height = height; }

    @OneToMany(mappedBy="mountainId")
    public List<ExplorerEntityBase> getExplorers() { return this.explorers; }
    public void setExplorers(List<ExplorerEntityBase> explorers) { this.explorers = explorers; }

}    

.

@Entity
public class MountainEntity extends MountainEntityBase implements Serializable {

    public List<MountainEntity> allMountainsExploredBy = new ArrayList<MountainEntity>();

    @Transient
    public List<MountianEntity> getAllMountainsExploredBy(String explorerName){
        // Implementation 
    }
}

Таким образом, любой расширенный класс будет определять только @Transient s вего тело.Но я также хочу учесть ситуации, когда дочерний класс пуст:

@Entity
public class MountainEntity extends MountainEntityBase implements Serializable {
}

Заранее благодарен за любую помощь в этом.

1 Ответ

8 голосов
/ 30 мая 2011

Наследование в JPA указывается для корневого объекта с помощью аннотации @Inheritance. Там вы можете указать представление базы данных иерархии. Проверьте документацию для более подробной информации.

Если ваши дочерние классы определяют только временные поля (а не методы) (т.е. не сохраняются в БД), то, возможно, лучшим вариантом будет столбец дискриминатора. Но может случиться так, что вам на самом деле не нужно наследование - у основного объекта могут быть все методы (потому что у него есть все поля, над которыми работают методы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...