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

Java 将注释应用于从@MappedSuperclass继承的字段,java,inheritance,jpa,annotations,mappedsuperclass,Java,Inheritance,Jpa,Annotations,Mappedsuperclass,有: 及 如何在子类中用@GeneratedValue注释继承的id,用@Index注释字段 如何在子类中用@GeneratedValue注释继承的id,用@Index注释字段 好吧,你不能。您可以使用AttributeOverride和AssociationOverride注释覆盖属性和关联(即更改列或联接列)。但你不能完全按照你的要求去做 对于 GealdValue,如果不想在映射的超类中声明它,请考虑使用XML映射来覆盖该策略。 对于索引(顺便说一句,它不是一个标准的注释),您是否确实尝试

有:

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

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

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

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

对于
索引
(顺便说一句,它不是一个标准的注释),您是否确实尝试在表级别使用Hibernate的
注释来声明它(我假设您使用的是Hibernate)

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

工具书类
  • JPA1.0规范
    • 第2.1.9.2节“映射超类”
    • 第9.1.10节“属性超越注释”
    • 第9.1.11节“属性覆盖注释”
    • 第9.1.12节“关联超越注释”
    • 第9.1.13节“关联超越注释”
  • Hibernate注释参考指南

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


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

@Entity
public class Subclass extends Superclass {

    @GeneratedValue
    public long getId() {
        return super.getId();
    }
private List getAllFields(){
列表字段列表=新的ArrayList();
//添加当前类中的所有字段
addAll(Arrays.asList(mElement.getClass().getDeclaredFields());
//使用索引迭代mElement的父类型
Class clazz=mElement.getClass();
//从父类获取任何字段
while(clazz.getSuperclass()!=null){
addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields());
//将其设置为该父类
clazz=clazz.getSuperclass();
}
返回字段列表;
}

返回的列表将包含所有父类和子类的所有字段,
mElement
是您从中搜索注释的对象。希望这有帮助。

至于
@GeneratedValue
,可以这样做:

@MappedSuperclass
类超类{
@身份证
@列(name=“id”)
@GeneratedValue(generator=“id_generator”)
保护长id;
@列(name=“field”)
私人长田;
}
@实体
@SequenceGenerator(name=“id\u generator”,sequenceName=“id\u seq”)
类子类扩展了超类{
}

关于这一点有什么新的说法吗?对于当前版本的hibernate是否仍然如此?
@Entity
class Subclass extends Superclass {

}
@Table(appliesTo="tableName", indexes = { @Index(name="index1", columnNames=
    {"column1", "column2"} ) } ) 
@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();
    }
    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;
}