アプリケーションには、Customer や Tenant などのドメイン クラスがほとんどありません。顧客ドメイン インスタンスには tenantId 参照がありますが、テナント ドメイン クラスとの関連付けはありません。
@ToString(includeNames = true, includeFields = true, excludes = 'dateCreated,lastUpdated,metaClass')
@EqualsAndHashCode
class Customer {
Integer id
Integer tenantId
Long version
String type
Date dateCreated
Date lastUpdated
static mapping = {
table "customer"
id column: "customerid", generator:'native', params:[sequence:'customer_customerid_seq']
tenantId column:"tenantid"
version column: "version"
dateCreated column:"datecreated"
lastUpdated column:"lastupdated"
}
}
@ToString(includeNames = true, includeFields = true, excludes = 'dateCreated,lastUpdated,metaClass')
@EqualsAndHashCode
class Tenant {
Long id
String name
Long version
static mapping = {
table "tenant"
id column: "tenantid"
}
}
OrderController で Customer のタイプを取得しようとしています。複数のメソッドで使用されるため、Customer をフェッチするサービス メソッド「getClerkCustomer」を作成しました。ユーザーがログインすると、tenantId の値がセッションに保存されます。したがって、OrderController の tenantId 値はセッションから取得され、「getClerkCustomer」に渡されます。
Customer getClerkCustomer(Long tenantId) {
Customer customer = Customer.findByTypeAndTenantId(CUSTOMER_TYPE_CLERK, Math.toIntExact(tenantId))
return (customer)
}
「getClerkCustomer」が実行されると、タイプとテナント ID に基づいて顧客が取得されます。Customer レコードをフェッチするだけでなく、tenantId の Tenant レコードも更新します (バージョン値がインクリメントされます)。Customer レコードをフェッチするときに Tenant レコードのバージョンが増加する理由がわかりません。Grails には、名前でレコードを更新するための何らかの意図がありますか?
テナントが顧客フェッチ用に更新される理由と、それを回避する方法を誰か教えてもらえますか?
注 : この問題は、他のドメイン インスタンスでも発生します。一度インスタンスを更新すると、別のインスタンスのバージョンがインクリメントされます。上記はそのようなシナリオの 1 つです。
Version of Grails is 3.0.9
Datbase is postgres