Применение аннотаций к полям, унаследованным от @MappedSuperclass - PullRequest
4 голосов
/ 30 сентября 2010

Имеет:

@MappedSuperclass
class Superclass {

    @Id
    @Column(name = "id")
    protected long id;

    @Column(name="field")
    private long field;

}

и

@Entity
class Subclass extends Superclass {

}

Как аннотировать унаследованный идентификатор с @GeneratedValue и поле с @Index в подклассе?

Ответы [ 4 ]

5 голосов
/ 30 сентября 2010

Как аннотировать унаследованный идентификатор с помощью @GeneratedValue и поле с @Index в подклассе?

AFAIK, ты не можешь. Что вы можете сделать, так это переопределить атрибуты и ассоциации (то есть изменить столбец или объединить столбец) с помощью аннотаций AttributeOverride и AssociationOverride. Но вы не можете сделать именно то, что вы просите.

Для GeneratedValue рассмотрите возможность использования сопоставления XML для переопределения стратегии, если вы не хотите объявлять ее в сопоставленном суперклассе.

Для Index (кстати, это не стандартная аннотация), вы на самом деле пытались объявить его на уровне таблицы, используя вместо этого аннотацию Table Hibernate (я предполагаю, что вы используете Hibernate)?

@Table(appliesTo="tableName", indexes = { @Index(name="index1", columnNames=
    {"column1", "column2"} ) } ) 

создает определенные индексы на столбцы таблицы tableName.

Ссылки

1 голос
/ 08 сентября 2014

Что касается @GeneratedValue, то можно сделать так:

@MappedSuperclass
class Superclass {

    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "id_generator")
    protected long id;

    @Column(name = "field")
    private long field;

}
@Entity
@SequenceGenerator(name = "id_generator", sequenceName = "id_seq")
class Subclass extends Superclass {

}
0 голосов
/ 08 сентября 2014

На всякий случай, если кто-то другой ищет это, я использовал следующий код, который добавляет некоторые накладные расходы, но для обработки только аннотации к Полям не следует добавлять слишком много:

    private List<Field> getAllFields() {
    List<Field> fieldList = new ArrayList<Field>();

    // Add all fields from the current class
    fieldList.addAll(Arrays.asList(mElement.getClass().getDeclaredFields()));

    // Use an index to iterate over mElement's parent types
    Class clazz = mElement.getClass();

    // Get any fields from the parent class(es)
    while (clazz.getSuperclass() != null) {
        fieldList.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
        // Set it to that parent class
        clazz = clazz.getSuperclass();
    }

    return fieldList;
}

Возвращенный список будет содержать все поля для всех родительских и дочерних классов, причем mElement является объектом, из которого вы ищете аннотации. Надеюсь, это поможет.

0 голосов
/ 02 октября 2010

Вы можете сделать это, если вместо этого примените аннотации к методам доступа.(Я не пробовал это, поэтому я не могу гарантировать, что это будет работать.)

@MappedSuperclass
public class Superclass {

    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }

.

@Entity
public class Subclass extends Superclass {

    @GeneratedValue
    public long getId() {
        return super.getId();
    }
...