問題タブ [grails-orm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
grails - Grails GORM コンポジションまたは hasOne?
静的な hasOne マップを使用することと、ドメイン クラスでオブジェクトを作成することの違いについて、少し混乱しています。2つの違いは何ですか?すなわち。
対
ここで、GraduateCommittee は別の GORM ドメイン モデル クラスです。
hibernate - Grails の楽観的ロックの奇妙な動作
統合テストでGORMに楽観的ロックエラーをスローさせようとしています。複数のスレッドに頼らずに同時更新エラーをテストすることはできないと前に言われましたが、それでも私のテスト ケースの動作は驚くべきものでした。
Widget の再アタッチされたインスタンスはデータベースに永続化されませんが、例外はスローされません!
私のテストケースはかなり不自然ですが、それでも結果には驚かされます。
誰でもこれを説明できますか?
grails - スーパークラス オブジェクトのみを返す GORM list()
単純なオブジェクト階層があり、list() を使用して各オブジェクトをクエリしたいと考えています。問題は、ポリモーフィズムのために、Task.list() が Task 型と ComplexTask 型の両方のインスタンスを返すことです。
共通の抽象スーパークラスを使用するか、返された型に基づいて結果をフィルタリングすることで問題を解決できることを認識していますが、動的ファインダーを使用してスーパークラス インスタンスのみを取得する方法があるかどうか疑問に思っていました。
grails - Grails でレガシー データベース テーブルをマッピングするときにテーブルの変更を回避しますか?
Grails ドメイン クラスから自動生成されたいくつかのテーブルと、legacy
Grails の外部で作成されたが Grails ドメイン クラスによってマップされている 1 つのレガシー テーブル ( table など) を含むアプリケーションがあります。レガシーデータベースの列をマッピングするのは簡単ですが、Grailsがそのテーブルに対して処理しようとする余分なフィールドとインデックスの追加を無効にしたいと思います.
私の質問は次のとおりです。Grails にテーブルに変更を加えないlegacy
ようにするにはどうすればよいですか(インデックス、外部キー、バージョン列などの追加などの変更)。
すべてのテーブルの自動スキーマ生成/更新を無効にしたくないことに注意してください。マップされたテーブルに対してのみですlegacy
。
sql - grails の多対多関係の hql クエリで結合テーブルにアクセスする
Grails で多対多の関係を持つ 2 つのドメイン クラスがあります: デッキとカードです。
セットアップは次のようになります。
デッキを削除した後、デッキに属さないカードもすべて削除したいです。これを実現する最も簡単な方法は、次の sql のようなものを記述することです。
ただし、結合テーブルであるdeck_cardsには対応するgrailsドメインクラスがないため、このSQLに解決されるHQLクエリを作成する方法がわかりません。HQL では delete ステートメントで結合を使用できないため、通常の結合を使用してこのステートメントを作成することはできません。また、サブクエリを使用してこの制限を回避すると、mySQL が文句を言います。サブクエリの「from」セクションで from を削除します。
また、休止状態の「delete-orphan」カスケード オプションを使用してみましたが、その結果、デッキが削除されると、それらのカードが他のデッキにも属している場合でも、すべてのカードが削除されます。私は夢中になっています - これは簡単な作業のようです。
編集 「デッキ」と「カード」のこの特定の使用法については、混乱があるようです。このアプリケーションでは、「カード」はフラッシュカードであり、デッキには何万枚もある可能性があります。また、ユーザーが必要に応じて編集できるように、デッキのコピーを作成する必要がある場合もあります。このシナリオでは、すべてのカードをコピーするのではなく、新しいデッキは古いデッキと同じカードを参照するだけで、カードが変更された場合にのみ新しいカードが作成されます。また、この削除は groovy のループで実行できますが、(上記の SQL を使用して) 1 つではなく数万の SQL 削除ステートメントが生成されるため、非常に遅く、リソースを大量に消費します。HQL で結合テーブルのプロパティにアクセスする方法はありませんか?
grails - removeFrom は、多対多の関連付けをすべて削除しています
私は Grails 1.2 を使用しており、次の多対多の関係を設定しています。
Bootstrap.groovy にいくつかのデータをシードします。
これにより、次の DB データが生成されます。
次に、ストアから 1 人の従業員を削除しようとします。
これにより、すべての従業員が削除されます。私は関係を間違ってセットアップしましたか?
hibernate - Grails で ID を介して直接関連付けを設定する
1 対多の関係を持つ 2 つのドメイン オブジェクトがあります。例として:
データベースでは、post テーブルに author_id というフィールドがあります。私のアプリケーションには、投稿に関連付けたい多数の著者 ID があります。これを行うには、最初に各著者のデータベースをクエリし、次に author.addToPosts(post) を呼び出します。しかし、私はすでに作成者オブジェクトの ID を持っているので、post.authorId = authorId を直接設定して関連付けを行い (これはとにかくすべて grails が行うことです)、必要なクエリの数を半分に減らすことができるはずです。
私が書いている実際のアプリケーションでは、これを行うことで、必要なクエリの量が約 70% 削減されます。これはアプリケーションの重大なボトルネックであり、SQL のパフォーマンスが低下するわけにはいきません。これを正確に実行するSQLステートメントを簡単に作成できますが、grailsでauthor_idを直接設定して手動で関連付けを行う方法がわかりません。Rails では、この種の機能がアクティブ レコードに組み込まれています。grails でこれを行う方法はありますか?
grails - Grails/Groovyで1対多の関係でコレクションをクリアして置き換えるにはどうすればよいですか
この質問は 2 つの部分に分かれています。最初の部分はリストのクリアに関するもので、2 番目の部分は所有者をオブジェクトに割り当てることに関するものです。
Grails のモデル内の 2 つのドメイン オブジェクト間に 1 対多の関係があります。関係はこんな感じ…
私のアプリでは、locations
リストPerson
が完全に更新され、ユーザー アクションの新しいリストに置き換えられます。Location
さらに、関連付けられているオブジェクトとは関係なく、オブジェクトのリストを取得しますPerson
。現在ログインしているユーザーを取得することで、それらを適用する人を解決します。これは、私が呼び出したものactivePerson
であり、私の目的には問題ありません。
私がやりたいことは、既存の場所をすべて削除し、新しい場所をactivePerson
すべて挿入して、それらを に関連付けるactivePerson
ことです。Person
この時点で保持したくないプロパティがたくさんあるので、子の場所が変更されたという理由だけで親オブジェクト全体を保存することは避けたいと思います。
リストを反復処理activePerson.locations
して 1 つずつ削除し、GORM/Hibernate に依存してクエリをまとめてバッチ処理し、最後にフラッシュすることを考えました。これは力ずくのように思えますが、うまくいくかもしれません。メソッドか何か似たようなものがあるclearLocations
と思っていたのですが、見つかりません。
を新しいリストに置き換えてactivePerson.locations
を呼び出すとactivePerson.save(flush:true)
、GORM は既存の行の削除を処理しますか?
次に、新しいLocation
オブジェクトを に配置しactivePerson
ます。もう一度入力しactivePerson.locations
て全体を保存することはできますが、できればそれは避けたいと思います。belongsTo
それらを個別に保存することはできますが、各Location
オブジェクトを設定するにはどうすればよいですか?
要約すると:
- 1 対多のコレクションの多側にあるリストをクリアするにはどうすればよいですか?
- 独立したオブジェクトを親オブジェクトに関連付けて個別に永続化するにはどうすればよいですか?
ありがとう
database - Grails はデータベースの列サイズを制限します
私のGrailsアプリには、プロパティを持つドメインクラスがあります
SearchPrivacy は列挙型です
Grails docs によると、マップされたデータベース列には、pr
またはプロパティpu
の値が格納されますid
。ただし、DB 列の最大長を減らす方法はないようです。次の両方を追加しようとしました
しかし、生成されたスキーマでは、列はまだvarchar(255)
ありがとう、ドン
grails - Grails グローバル制約
バージョン 1.2 で、Grails はグローバル制約を導入しました。Config.groovyに以下を追加してみました
次に、ドメインクラスの1つでそれを使用します
しかし、空の電子メール アドレスでユーザーを保存すると、エラーが報告されません。なぜですか?
ありがとう、ドン