2015-08-06 2 views
1

Я хотел бы построить что-то вроде этого:Как реализовать унаследованные модели в ActiveJDBC с ассоциациями между суперклассом и другой моделью?

abstract class Owner extends Model {} 
class User extends Owner {} 
class Group extends Owner {} 
class Thing extends Model {} 

где каждый Thing имеет один и только один Owner, который может быть Group или User. Как это возможно? Должен ли я сделать Владелец не абстрактным, чтобы ActiveJDBC сопоставлял owner_id-column в таблице вещей с владельцем? Но как он определяет, какой у нас владелец, как http://javalite.io/inheritance говорит, что наследование отдельных таблиц не реализовано в ActiceJDBC.

ответ

0

Вам необходимо использовать Polymorphic Associations. Существует разница между наследованием и владением.

Наследование ActiveJDBC ограничено передачей общей функциональности подклассам. Затем вам нужно использовать отношения, чтобы создать «A имеет много B» и т. П., И Polymorphic Associations кажется вашим лучшим выбором.

Итак, в вашем случае пользователь и группа будут полиморфными родителями Thing. Тогда вы можете создать отдельного владельца класса (только если у них есть некоторые функции).

Итак, у вас будет три таблицы: ПОЛЬЗОВАТЕЛИ, ГРУППЫ, ВЕЩИ.

+0

Спасибо за ответ. Недостатком этого решения является то, что Thing может иметь группу _and_ пользователя как родителя вместо уникального владельца. Может быть, это может быть обработано с помощью валидации - пока я еще не прошел проверку ActiveJDBC. Но преимущество в том, что он должен работать :-) Я попробую. – Mischa

+0

Кажется, очень медленно я получаю это: у Тига не может быть обоих родителей, поскольку специальные колоды предотвращают это. В таблице есть только один родительский идентификатор. Большой! – Mischa

+0

Теперь он работает как шарм. Я создал владельца класса, потому что я не всегда знаю, какой именно тип. Thing поэтому имеет этот метод: public Owner getOwner() { if (this.getString ("PARENT_TYPE"). EndsWith ("Group")) { return this.parent (Group.class); } return this.parent (User.class); } – Mischa