我可以“覆盖”超类私有字段的注释吗?

时间:2018-12-09 22:00:13

标签: java jpa inheritance data-annotations

使用其他编程语言已有20年了,现在我对Java还是陌生的,感觉像个菜鸟程序员...

我使用一个Indexable抽象类来扩展我所有的@entity类,因此不需要将@Id @GeneratedValue @SequenceGenerator放在所有这些类上。我还有Auditable@CreatedBy @CreatedDate @ModifiedBy @ModifiedDate,它们指向那些继承路径:

  • MostEntityClasses> AuditableClass> IndexableClass;
  • SomeEntityClasses>可索引的类。

现在我注意到99%的实体类还具有:

@Column(nullable = false, unique = true) private String name;

我考虑过将这行代码移至Indexable类中,以避免那99%的样板代码,但是两个没有 name 字段的类很重要 auditable 类,我不想只是将所有祖先字段复制到它们中,只是为了防止在其上出现空名称错误。

问题是:如果我在这两个类上重写了该字段的注释以使其可为空并且是瞬态的,它将避免在表上创建该字段并且不会以null困扰用户名字?

class SomeAuditableClass extends Audited {
  //@override
  @Column(nullable = true) @Transient private String name;

Is there a way to override class variables in Java?中的内容没有太大帮助...

2 个答案:

答案 0 :(得分:2)

虽然不能回答您的确切问题,但是解决此问题的典型方法是将Indexable扩展到另一个类,例如IndexableWithName。然后,您拥有name字段的实体中的99%将扩展IndexableWithName,而没有name字段的两个类将直接扩展Indexable

我不能不说,就数据库映射而言,您提出的建议是否可行。但是我认为这将是不好的类设计,因为您可能在超类中的name字段上有一个吸气剂,或者有一个二传手,并且它们对于没有真正拥有的两个类没有意义。 name字段。

答案 1 :(得分:2)

不,您不能覆盖它们:

  • 在Java语言级别,没有针对字段的注释覆盖机制。
  • 子类中无法访问父类的私有字段,以防止子类破坏/干扰抽象。

在运行时,您可能会使用反射破坏抽象,以查看超类私有字段的注释。但是您不能添加或删除它们:请参见Adding Java Annotations at Runtime。即使可以,运行时也可能为时已晚。

在这里可以吸引您的唯一方法是识别正在处理批注的代码,并将其修改为(以某种方式!)接受某些(非Java)文件的替代。

但是对于您的用例,这似乎是一个非常糟糕的主意。您不想创建和维护具有非标准功能的(例如)Hibernate的私有分支,只是为了节省相对较少的样板代码。