【问题标题】:Is there any way to omit a variable from super class?有没有办法从超类中省略一个变量?
【发布时间】:2010-11-22 03:27:58
【问题描述】:

我的应用程序类使用了一个库,其中默认包含两个变量。

   // A class from framework:

public class SuperClass implements Serializable {

  private long id;
  private long version;

  // getter and setter methods for these variables...

}

我应该扩展这个类,以便访问框架的一些功能。

如果我像这样将这个类扩展到我自己的类:

public class MyClassChild extends SuperClass {

  private long myprimarykey;
  private String some column;
  private long myversion;

  // getter and setter methods for these variables...

}

根据编程模型,这两个变量也可以访问。 在实现需要 SuperClass 类型的 Object 的操作时。

有什么想法可以扩展不包括这两个变量 (id, version) 的 SuperClass 吗?

我不知道该怎么办?

有什么建议吗?

谢谢

【问题讨论】:

  • 这些变量如何在您的子类中可见?它们被声明为私有的,而不是受保护的。
  • 我猜你是在使用像 Hibernate 或 JPA 这样的 ORM 框架?您可以看到这些变量的唯一方法是通过反射。只是您不希望这些变量保留在您的子类中吗?
  • 正是男人。如何不持久化这两个变量?
  • 你在使用 JPA 注释吗?
  • 是的,使用 Eclipselink [eclipse.org/eclipselink/jpa.php].

标签: java jpa eclipselink


【解决方案1】:

您不能删除这些字段,但您可以覆盖 getter 和 setter 以执行默认值以外的操作(这取决于它们的访问修饰符,但它们可能是 protected 或更大)。例如,通过这种方式,您可以停止这些变量的外部分配。如果您选择这条路线,我建议您熟悉这些字段在超类中的使用方式,以便您可以预测任何连锁反应。

【讨论】:

    【解决方案2】:

    一般而言,JPA 不允许您覆盖超类映射以删除属性,但根据您的提供者,可能会执行以下操作:

    public class MyClassChild extends SuperClass {
    
      private long myprimarykey;
      private String some column;
      private long myversion;  
    
      // Override superclass mappings
      @Transient
      long getId() { return super.getId(); }
      @Transient
      void setId(long id) { return super.setId(long id); }
      // etc...
    }
    

    编辑

    此外,还可以通过使用@AttributeOverride 注释来覆盖映射超类中各个列的值,例如

    @AttributeOverride(name="id", column=@Column(name="EMP_ID"))
    @Entity
    public class MyClassChild extends SuperClass {
    
      private String some column;
      ...
    }
    

    【讨论】:

    • 我的问题是变量名。我不想将“Id”作为 Id,将“version”作为版本。我的意思是,想换个名字。
    • 您是指表中的列名还是类中的实际方法名,还是两者兼而有之?
    • 当我执行任何操作“选择、插入或任何东西”时,这两个变量“id”和“版本”预计会出现在数据库表中。但是,如果在persistence.xml中添加'',这两个变量直接映射到创建数据库表列。我想要做的是我已经使用了我的主键,例如:“EMP_ID”而不是“ID”,并且“版本”不是一个大问题。
    • 非常感谢,这就是我要搜索的内容。但是...有可能有多个主键吗?以及如何完成外键关系。我的意思是,我们需要在 pojo 类中指定任何约束吗?请也帮我解决这个问题...
    • @Deab Povey:您能否更新您对@AttributeOverride(name="id", column=@Column(name="EMP_ID")) 的回答。您在中间漏掉了一个逗号。谢谢:)
    【解决方案3】:

    不。如果你在继承,你会得到整个班级。如果你不想继承所有的字段,你就没有设计一个子类。

    想象一下如果你可以省略变量会发生什么 - 继承的方法会对现在缺失的状态做什么?一切都会崩溃……

    【讨论】:

    • 不能实现这种操作吗?
    【解决方案4】:

    您所能做的就是将该变量设为超类的私有变量,这样子类就不会“看到”它。

    【讨论】:

      【解决方案5】:

      当你扩展一个类时,你应该添加更多的变量和方法,你不能减去。

      【讨论】:

        猜你喜欢
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2020-09-22
        • 2023-03-29
        • 2020-08-21
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多