Динамическое наследование - Java - PullRequest
2 голосов
/ 17 июля 2010

Динамическое наследование

У меня есть ситуация, когда я хочу, чтобы класс (который является сущностью JPA) мог динамически расширять либо класс A, либо класс B.Я думал о том, чтобы использовать дженерики, но похоже, что дженерики не поддерживают это.Например:


@Entity
public abstract class Resource() {
...
}

@Entity
public abstract class Snapshot() {
...
}

public abstract class CommonRS<R extends Resource, S extends Snapshot> {
/* This is the class that I want to dynamically assign Inheritance to. */
...
}

@Entity
public class FeedResource extends CommonRS<Resource> {
...
}

@Entity
public class FeedSnapshot extends CommonRS<Snapshot> {
...
}

Причина, по которой я хочу это сделать, заключается в том, что FeedResource должен наследовать от Resource, а FeedSnapshot должен наследоваться от Snapshot, поскольку оба класса используют стратегию соединения JPA InheritanceType.JOINED и сохраняются в разных таблицах.Однако они оба имеют общие атрибуты, и я хотел бы, чтобы они могли наследовать эти общие атрибуты.

Я понимаю, что могу использовать @Embeddable на CommonRS и встроить его в FeedResource и FeedSnapshot.

Поскольку Java не поддерживает множественное наследование, я не вижу никаких другихспособ сделать это, кроме использования Embeddable.

Заранее спасибо.

1 Ответ

2 голосов
/ 17 июля 2010

Вот как вы это делаете

@MappedSuperClass
public abstract class Base() {
...
// put your common attributes here
}

@Entity
public abstract class Resource() extends Base{
...
}

@Entity
public abstract class Snapshot() extends Base {
...
}

public abstract class CommonRS<R extends Base> {
...
}

@Entity
public class FeedResource extends CommonRS<Resource> {
...
}

@Entity
public class FeedSnapshot extends CommonRS<Snapshot> {
...
}

ОБНОВЛЕНИЕ

Другим решением может быть реализация того же интерфейса (если невозможно добиться общего наследования).В этом случае аннотация @MappedSuperClass должна использоваться для реальных базовых классов.

@Entity
public abstract class Resource() extends BaseIntf {
...
}

@Entity
public abstract class Snapshot() extends BaseIntf {
...
}

public abstract class CommonRS<R extends BaseIntf> {
...
}

@Entity
public class FeedResource extends CommonRS<Resource> {
...
}

@Entity
public class FeedSnapshot extends CommonRS<Snapshot> {
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...