繁体   English   中英

如何在Scala中覆盖特征变量名称

[英]How to override trait variable name in Scala

我有以下scala特征

trait Id {
            @javax.persistence.Id
            @GeneratedValue(strategy=GenerationType.IDENTITY)
            @BeanProperty
            var id: Long = _
}

现在,我有一个实体(人),我想扩展其Id特性,但将id列名称更改为personid。 我该如何实现?
下面的人员摘要:

@NamedQuery(name=”findAll”,query=”select p from Person p”)
class Person extends Id {
    @BeanProperty
    @Column(name=”personid”)
    def personid = id
}

您可以引入方法personid ,该方法返回id的值:

trait Person extends Id {
  def personid = id
}

Person删除id成员将违反以下原则:子类实例必须始终可用,就好像它们是基类的实例一样。 也就是说,如果Person扩展了Id ,则您必须能够在其上调用所有id方法,否则您将无法将Person类型的对象分配给Id类型的引用。

因此,如果扩展Id ,则扩展的特征/类将始终具有id

但是,您可以通过使id package-private来限制id在基本特征Id的可见性:

private[package_name] var id: Long = _

如果您要做的只是简单地覆盖JPA使用的列名,那么您应该能够使用AttributeOverride注释。

它可能看起来像:

@MappedSuperclass
trait Id {
        @javax.persistence.Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @BeanProperty
        var id: Long = _
}

@Entity
@AttributeOverride(name="id", column=@Column(name="personid"))
class Person extends Id

如果要更改用于访问id的属性名称,则可以执行类似Alex的建议...

编辑:忘记让Person实体扩展Id特性

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM