将注释应用于从@MappedSuperclass继承的字段

时间:2010-09-30 14:12:39

标签: java inheritance jpa annotations mappedsuperclass

有:

@MappedSuperclass
class Superclass {

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

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

}

@Entity
class Subclass extends Superclass {

}

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

4 个答案:

答案 0 :(得分:5)

  

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

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

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

对于Index(顺便说一下,这不是一个标准的注释),你是否真的尝试使用Hibernate的Table注释在表级声明它(我假设你是使用Hibernate)?

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

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

参考

答案 1 :(得分: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 {

}

答案 2 :(得分: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();
    }

答案 3 :(得分: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是您要从中搜索注释的对象。希望这会有所帮助。