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