簡體   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