2015-09-22 27 views
1

我用斯卡拉了MyBatis:一個VAL值豆如何改變

Space.scala:

case class Space(
       val id: Long , 
       spaceName:String) 

SpaceDao:

val space=Space(0,"space name") 
    val mapper = session.getMapper(classOf[SpaceMapper]) 
    val result = mapper.insertSpace(space) 
    println(space.id) 

結果空間ID是MySQL的的自動遞增數,而不是0.但空間和space.id是val,爲什麼可以更改val值?

+0

你怎麼證明'space' id已經改變了? – ka4eli

+0

我在運行插入時跟蹤了代碼,它是同一個對象,但是'id'值是由類SetFieldInvoker中的mybatis改變的,在「field.set(target,args [0])」之後,該字段是「private final long model .Space.id「 –

+1

[Scala反射更新案例類val]的可能重複(http://stackoverflow.com/questions/21431263/scala-reflection-to-update-a-case-class-val) –

回答

3

這可以通過reflection實現(這是由SetFieldInvoker使用):

反射常用的需要檢查或修改的應用程序在 Java虛擬運行的運行時行爲能力 方案機。這是一個相對高級的功能,只有對這些語言的基礎知識 有深入瞭解的開發人員才能使用。考慮到這一點,反射技術是一種強大的技術,可以使應用程序執行操作,否則這些操作是不可能的。

另請參閱此question