thi*_*lko 6 java annotations hibernate-annotations
我有这个带注释的hibernate类:
@Entity
public class SimponsFamily{
@Id
@TableGenerator(name = ENTITY_ID_GENERATOR,
table = ENTITY_ID_GENERATOR_TABLE,
pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME,
valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME)
@GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR)
private long id;
...
}
Run Code Online (Sandbox Code Playgroud)
因为我不会以这种方式注释我的类的每个id字段,所以我尝试创建自定义anotation:
@TableGenerator(name = ENTITY_ID_GENERATOR,
table = ENTITY_ID_GENERATOR_TABLE,
pkColumnName = ENTITY_ID_GENERATOR_TABLE_PK_COLUMN_NAME,
valueColumnName = ENTITY_ID_GENERATOR_TABLE_VALUE_COLUMN_NAME)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface EntityId {
@GeneratedValue(strategy = GenerationType.TABLE, generator = ENTITY_ID_GENERATOR)
public int generator() default 0;
@Id
public long id() default 0;
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以在课堂上使用这个注释:
@Entity
public class SimponsFamily{
@EntityId
private long id;
...
}
Run Code Online (Sandbox Code Playgroud)
我必须在字段级别编写@Id和@GeneratedValue注释,因为它们不支持TYPE RetentionPolicy.这个解决方案似乎有效.
我的问题:
如何将自定义注释(和值)中的字段级注释转移到我对EntityId注释的使用?
我在自定义注释中设置的默认值如何使用,因为我没有在使用中指定属性?
在注释中在字段级别使用注释是一种首选方法吗?
我想我可以回答你的第三个问题。
执行您想要的操作(避免重复 ID 映射)的一种常见方法是创建一个公共超类,该超类保存带注释的id和version(用于乐观锁定)字段,然后让所有持久对象扩展此超类。为了确保超类本身不被视为实体,它必须用 进行注释@MappedSuperclass。
这是一个示例(抱歉,有拼写错误,我手头现在没有 IDE):
@MappedSuperclass
public class PersistentObject {
@Id // Put all your ID mapping here
private Long id;
@Version
private Long version;
}
@Entity
public class SimpsonsFamily extends PersistentObject {
// Other SimpsonFamily-specific fields here, with their mappings
}
Run Code Online (Sandbox Code Playgroud)