在其他编程语言20年,现在我是Java的新手,感觉像一个菜鸟程序员......
我使用 Indexable
抽象类来扩展我的所有 @entity
类,所以我不需要将 @Id @GeneratedValue @SequenceGenerator
放在所有类上 . 我也有 Auditable
与 @CreatedBy @CreatedDate @ModifiedBy @ModifiedDate
导致这些继承路径:
-
MostEntityClasses> AuditableClass> IndexableClass;
-
SomeEntityClasses> IndexableClass .
现在我注意到99%的实体类也有:
@Column(nullable = false, unique = true) private String name;
我想把那一行移到 Indexable
类以避免那些99%的样板代码,但是没有name字段的两个类是重要的可审计类,我不想只是将所有祖先字段复制到它们只是为了防止空名称的错误 .
The question is: 如果我在这两个类上覆盖该字段的注释以使其可以为空并且是暂时的,那么它是否可以避免在表上创建此字段并且不会使用空名称来打扰用户?
class SomeAuditableClass extends Audited {
//@override
@Column(nullable = true) @Transient private String name;
Is there a way to override class variables in Java?中的内容没有多大帮助......
2 回答
虽然不能解决您的确切问题,但接近此问题的典型方法是将
Indexable
扩展为另一个类,例如IndexableWithName
. 然后,具有name
字段的99%的实体将扩展IndexableWithName
,而没有name
字段的两个类将直接扩展Indexable
.在没有尝试的情况下,我不能说,就数据库映射而言,您提出的建议是否有效 . 但我认为这将是一个糟糕的类设计,因为大概你会有一个getter并且可能是超类中
name
字段的setter,并且他们不会真的有一个name
字段 .不,你不能覆盖它们:
在Java语言级别,没有字段的注释覆盖机制 .
父类的私有字段在子类中是不可访问的,以防止子类破坏/干扰抽象 .
在运行时,您可能会使用反射来破坏抽象,以便将注释视为超类私有字段 . 但您无法添加或删除它们:请参阅Adding Java Annotations at Runtime . 即使你可以,运行时可能为时已晚 .
你可以获得一些牵引力的唯一方法是识别处理注释的代码,并将其修改为(某种程度上!)接受来自某些(非java)文件的覆盖 .
但对于你的用例,这似乎是一个非常糟糕的主意 . 您不希望创建和维护具有非标准功能的(例如)Hibernate的私有分支,只是为了在样板代码上节省相对较少的数量 .