JPA (Hibernate-поддержка), проведенное многоуровневое наследствоJAVA

Программисты JAVA общаются здесь
Anonymous
JPA (Hibernate-поддержка), проведенное многоуровневое наследство

Сообщение Anonymous »

Стратегия, которую я принимаю для реализации сценария проверки производителя, заключается в использовании нескольких таблиц. В настоящее время я использую Hibernate 4.2 (аннотации). Следующий сценарий - это то, чего я хотел бы достичь. Тем не менее, у меня проблемы с многоуровневым наследством. < /P>

Основная идея заключается в том, что есть две таблицы ( и утверждено ). Когда происходит add () , запись вставляется в таблицу ожидающего . Когда эта запись будет одобрена, она удаляется из ожидаемой таблицы и вставляется в утвержденную таблицу .

Код: Выделить всё

Policy (the policy)
|
+ -- Pending (maker information)
|
+ -- Approved (checker information)
< /code>

Итак, политика класса < /code> - это класс, который определяет необходимые поля для политики. Чтобы сохранить этот пост короче, поля не показаны. < /P>

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // problem
public abstract class Policy { ... }
Класс ожидающего предназначен для недавно добавленной политики , которая ожидает утверждения и имеет информацию о Maker/Adder.

Код: Выделить всё

@Entity
@Table(name = "pending")
public class Pending extends Policy {
@Column(name = "adder", ...)
private String adder;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "time_added", ...)
private Date timeAdded;
}
< /code>

Утвержденный класс < /code> предназначен для утвержденных объектов и содержит дополнительную информацию о утверждении в дополнение к информации из ожидаемого < /code> класса. < /p>

@Entity
@Table(name = "approved")
public class Approved extends Pending {
@Column(name = "approver", ...)
private String approver;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "time_approved", ...)
private Date timeApproved;
}
< /code>

Моя первая мысль была попробовать table_per_class < /code>. Тем не менее, это привело к следующей ошибке времени выполнения: org.hibernate.mappingException: не может использовать генерацию ключей столбца идентификатора с  отображение для: ... 
. Решение для этого состоит в том, чтобы изменить базовый класс @generatedValue (стратегия = GenerationType.identity) на @GeneratedValue (стратегия = GenerationType.table) . Тем не менее, изменение этого класса находится за пределами моего объема, поскольку он разделен по нескольким проектам. Очевидно, что Single_table привел к одной таблице с дополнительным столбцом dtype . Не то, что мы хотели. Присоединение привело к двум таблицам, но одобренная таблица имеет внешнюю ключ для ожидаемой таблицы . Since we wanted to remove an entry from the pending table and move it to the approved table, this would not work for us.

Currently, my solution is to as follows, which is basically copy and paste the code from the Pending class into the Approved class.

@Entity
@Table(name = "approved")
public class Approved extends Policy {
@Column(name = "adder", ...)
private String adder;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "time_added", ...)
private Date timeAdded;
@Column(name = "approver", ...)
private String approver;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "time_approved", ...)
private Date timeApproved;
}
< /code>

Это решение кажется непреодолимым, поскольку оно дублирует код. Существует ли решение, которое не требует дупликации кода и сохраняет процесс проверки производителя таким образом, в настоящее время оно работает?

Подробнее здесь: https://stackoverflow.com/questions/208 ... nheritance

Вернуться в «JAVA»