4

有:

@MappedSuperclass
class Superclass {

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

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

}

@Entity
class Subclass extends Superclass {

}

如何在子类中使用@GeneratedValue 和@Index 注释继承的id?

4

4 回答 4

5

如何在子类中用@GeneratedValue 注释继承的id 和@Index 字段?

AFAIK,你不能。您可以做的是使用AttributeOverrideAssociationOverride注释覆盖属性和关联(即更改列或连接列)。但是你不能完全按照你的要求去做。

对于GeneratedValue,如果您不想在映射的超类中声明它,请考虑使用 XML 映射来覆盖该策略。

对于Index(顺便说一句,这不是标准注释),您实际上是否尝试使用 Hibernate 的Table注释在表级别声明它(我假设您使用的是 Hibernate)?

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

在表 tableName 的列上创建定义的索引。

参考

  • JPA 1.0 规范
    • 第 2.1.9.2 节“映射的超类”
    • 第 9.1.10 节“AttributeOverride 注释”
    • 第 9.1.11 节“AttributeOverrides 注解”
    • 第 9.1.12 节“AssociationOverride 注释”
    • 第 9.1.13 节“AssociationOverrides Annotation”
  • Hibernate 注释参考指南
于 2010-09-30T18:44:53.117 回答
1

至于@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 {

}
于 2014-09-08T12:40:49.407 回答
0

如果您将注释应用于访问器方法,则可能可以做到这一点。(我还没有尝试过,所以我不能保证它会起作用。)

@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();
    }
于 2010-10-02T17:33:10.073 回答
0

以防万一其他人搜索此内容,我使用了以下代码,这增加了一些开销,但仅用于处理字段注释不应该增加那么多:

    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是您从中搜索注释的对象。希望这可以帮助。

于 2014-09-08T08:53:04.833 回答