有:
@MappedSuperclass
class Superclass {
@Id
@Column(name = "id")
protected long id;
@Column(name="field")
private long field;
}
和
@Entity
class Subclass extends Superclass {
}
如何在子类中使用@GeneratedValue 和@Index 注释继承的id?
有:
@MappedSuperclass
class Superclass {
@Id
@Column(name = "id")
protected long id;
@Column(name="field")
private long field;
}
和
@Entity
class Subclass extends Superclass {
}
如何在子类中使用@GeneratedValue 和@Index 注释继承的id?
如何在子类中用@GeneratedValue 注释继承的id 和@Index 字段?
AFAIK,你不能。您可以做的是使用AttributeOverride和AssociationOverride注释覆盖属性和关联(即更改列或连接列)。但是你不能完全按照你的要求去做。
对于GeneratedValue,如果您不想在映射的超类中声明它,请考虑使用 XML 映射来覆盖该策略。
对于Index(顺便说一句,这不是标准注释),您实际上是否尝试使用 Hibernate 的Table注释在表级别声明它(我假设您使用的是 Hibernate)?
@Table(appliesTo="tableName", indexes = { @Index(name="index1", columnNames= {"column1", "column2"} ) } )在表 tableName 的列上创建定义的索引。
至于@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 {
}
如果您将注释应用于访问器方法,则可能可以做到这一点。(我还没有尝试过,所以我不能保证它会起作用。)
@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;
}
返回的列表将包含所有父类和子类的所有字段,并且mElement是您从中搜索注释的对象。希望这可以帮助。