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

时间:2012-06-21 11:47:43

标签: java scala

我有scala特征如下

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

现在我有一个实体(Person),我想扩展Id特性,但是将id列名更改为personid。 我怎样才能做到这一点?
下面的人片段:

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

2 个答案:

答案 0 :(得分:4)

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

的值
trait Person extends Id {
  def personid = id
}

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

因此,如果您扩展Person,扩展特征/类将始终具有Id

但是,您可以通过Id package-private来限制id在基本特征id中的展示率:

Id

答案 1 :(得分:2)

如果你想要做的只是覆盖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特征