我有这个带注释的休眠类:
@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;
...
}
因为我不会注释每一个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)
@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;
}
这样我就可以在我的类中使用这个注释:
@Entity
public class SimponsFamily{
@EntityId
private long id;
...
}
我必须写@Id
和@GeneratedValue
字段级别的注释,因为它们不支持 TYPE RetentionPolicy。这个解决方案似乎有效。
我的问题:
我想我可以回答你的第三个问题。
执行您想要的操作(避免重复 ID 映射)的一种常见方法是创建一个公共超类来保存带注释的id
and 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)