Классы, представляющие таблицы, где поведение должно меняться строкой - PullRequest
0 голосов
/ 11 марта 2011

Мой заголовок немного смелый, вот проблема, о которой я говорю.

Скажем, у меня есть:

class Bill
{
   public String legislationID;
   public BillStatus currentStatus;
}

//and

class BillStatus
{
   public String description; 
}

Если сохранится, BillStatus соответствует таблице с одной строкой на каждое возможное состояние законодательного акта.(например, «На этаже дома», «На этаже сената» и т. д.).

Проблема, с которой я всегда сталкиваюсь, такова:

Как только поведение начинает меняться в зависимости от того, какой экземплярBillStatus привязан к Биллу, все это трудно представить.Я вижу два варианта:

1) Много переключателей в Bill, которые разветвляют поведение в зависимости от текущего BillStatus 2) методы в состоянии счета, которые принимают Bill в качестве параметра и имеют переключатели, которые выполняют различную логику в зависимости от идентичностипример.(таким образом, имитируя классы, реализующие общий интерфейс)

Оба эти метода кажутся небрежными.Я хотел бы иметь возможность сделать следующее:

class abstract BillStatus
{
    public abstract String getDescription();
    public abstract void callForVote(Bill bill);
}

Тогда:

@SpecialEntityTag(whenRowValue="HOUSEFLOOR")
class BillStatusHouseFloor extends BillStatus
{
     /* special overrides for some methods */     
}

class BillStatusGeneric extends BillStatus
{
    /* standard implementation of BillStatus */
}

Это должно быть распространенной проблемой.Я думаю об этом неправильно?По сути, цель состоит в том, чтобы инкапсулировать поведение, которое изменяется с определенным значением непримитивного дочернего свойства.

1 Ответ

0 голосов
/ 11 марта 2011

Что мешает вам использовать свой дизайн?

Hibernate (или JPA в целом) способен обрабатывать наследование, и вы можете хранить всю иерархию наследования в одной таблице со столбцом дискриминатора, указывающим, какой подкласс использовать для конкретной строки.

Подробнее см. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#inheritance-tableperclass.

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