有:
@MappedSuperclass
class Superclass {
@Id
@Column(name = "id")
protected long id;
@Column(name="field")
private long field;
}
和
@Entity
class Subclass extends Superclass {
}
如何使用@GeneratedValue注释继承的id,使用子类中的@Index注释?
答案 0 :(得分:5)
如何使用@GeneratedValue注释继承的id,使用子类中的@Index注释?
AFAIK,你做不到。您可以做的是使用AttributeOverride
和AssociationOverride
注释覆盖属性和关联(即更改列或连接列)。但你不能完全按照你的要求去做。
对于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
是您要从中搜索注释的对象。希望这会有所帮助。