【问题标题】:Can I "override" annotations of a superclass's private field?我可以“覆盖”超类私有字段的注释吗?
【发布时间】:2018-12-09 22:00:12
【问题描述】:

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 字段的两个类很重要 可审计 类,我不想只是将所有祖先字段复制到它们,以防止其上出现空名称错误。

问题是:如果我在这两个类上覆盖该字段的注释以使其可为空和瞬态,是否可以避免在表上创建此字段并且也不用 null 打扰用户名字?

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

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

【问题讨论】:

  • @AttributeOverride 注解不能模拟@Transient,可以吗?
  • 你尝试的时候发生了什么?
  • 我在建模阶段,还没试过,对不起!我不想以一种方式对其进行建模,直到意识到它是错误的,然后才不得不重新建模。

标签: java jpa inheritance data-annotations


【解决方案1】:

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

就数据库映射而言,我不能不尝试就说您的建议是否可行。但我认为这将是糟糕的类设计,因为大概你会有一个 getter 和一个 setter 用于超类中的 name 字段,并且它们对于没有真正有 @ 的两个类没有意义987654328@字段。

【讨论】:

  • 这是一个很好的方法,但是这 1% 扩展到 Auditable,后者扩展到 Indexable,因此它们间接扩展了 Indexable。
  • 对,你有点想在这里进行多重继承......如果有更多的字段不仅仅是name,我建议使用Embeddable,但对于单个字段可能不值得它。
【解决方案2】:

不,你不能覆盖它们:

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

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

您可以在这里获得一些吸引力的唯一方法是识别正在处理注释的代码,并将其修改为(不知何故!)接受来自某些(非 java)文件的覆盖。

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

【讨论】:

    猜你喜欢
    • 2022-06-18
    • 1970-01-01
    • 2012-02-22
    • 2012-08-12
    • 2012-01-23
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多