Например, у меня есть два класса: Person and Employee (Employee - подкласс Person). Лицо: имеет фамилию и имя. Сотрудник: имеет также зарплату.Как преобразовать ORM в свой подкласс с помощью Hibernate?
На стороне клиента у меня есть одна форма HTML, где я могу заполнять информацию о человеке (например, фамилию и имя). У меня также есть «переключатель» между «Лицом» и «Сотрудником», и если переключатель включен в Employee, я могу заполнить поле зарплаты.
С серверной стороны сервлеты получают информацию от клиента и используют инфраструктуру Hibernate для создания/обновления данных в/из базы данных. Отображение, которое я использую, представляет собой единую таблицу для лиц и сотрудников с дискриминатором.
Я не знаю, как преобразовать Person
к Employee
, путем модификации его type
, который используется в качестве DiscriminatorColumn
.
я поначалу пытался:
- нагрузки Людей р из базы данных
- создать пустую Соискатель Адрес объект
- значения копирования из р в е
- установить значение заработной платы
- сохранить e в базе данных
Но я не мог, поскольку Я также копирую идентификатор, и поэтому Hibernate рассказал мне, где два экземпляра ORM с одним и тем же идентификатором.
И я не могу отдать Личность в Работника напрямую, так как Лицо - это Суперкласс Работника.
Там, кажется, грязный способ: удалить человек и создать сотрудник с теми же информациями, но я не очень нравится ..
Так что я был бы признателен за любую помощь по этому поводу :)
Некоторые уточнения:
человек класс:
public class Person {
protected int id;
protected String firstName;
protected String lastName;
// usual getters and setters
}
класс сотрудника:
public class Employee extends Person {
// string for now
protected String salary;
// usual getters and setters
}
И в сервлет:
// type is the "switch"
if(request.getParameter("type").equals("Employee")) {
Employee employee = daoPerson.getEmployee(Integer.valueOf(request.getParameter("ID")));
modifyPerson(employee, request);
employee.setSalary(request.getParameter("salary"));
daoPerson.save(employee);
}
else {
Person person = daoPerson.getPerson(Integer.valueOf(request.getParameter("ID")));
modifyPerson(employee, request);
daoPerson.save(person);
}
И, наконец, нагрузка (в дао):
public Contact getPerson(int ID){
Session session = HibernateSessionFactory.getSession();
Person p = (Person) session.load(Person.class, new Integer(ID));
return p;
}
public Contact getEmployee(int ID){
Session session = HibernateSessionFactory.getSession();
Employee = (Employee) session.load(Employee.class, new Integer(ID));
return p;
}
С этим, я получаю ClassCastException при попытке загрузить Person используя getEmployee.
XML Hibernate отображения:
<class name="domain.Person" table="PERSON" discriminator-value="P">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<discriminator column="type" type="character"/>
<property name="firstName" type="java.lang.String">
<column name="FIRSTNAME" />
</property>
<property name="lastName" type="java.lang.String">
<column name="LASTNAME" />
</property>
<subclass name="domain.Employee" discriminator-value="E">
<property name="salary" column="SALARY" type="java.lang.String" />
</subclass>
</class>
достаточно ли ясно?: -/
Извините, я полностью не понял ваш вопрос, пока не прочитал ваш последний свой пост. Поэтому я удалил свой пост, он больше не держится. –
@ Adeel: По моей вине, я сначала не был достаточно ясен (без каких-либо реализаций). И спасибо за ваши ответы в любом случае :) – Vincent