問題タブ [apache-cayenne]
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.
java - ApacheCayenneの多対多の関係
私はApacheCayenneを初めて使用します。
Productというエンティティが1つだけあります。このエンティティは、それ自体と多対多の関係を持っています。つまり、製品には製品を含めることができ、他の製品に含めることができます。
カイエンとのこの関係をモデル化することはできません。私がしていることは次のとおりです。1)PKとFKの両方である2つのフィールドを持つCompositionというテーブルを作成します。2)ProductからCompositionまで2つのtoManyを作成します(1つはproduct.idからComposition.contained_idまで、もう1つはproduct.idからComposition.base_idまで)これはDBで機能するはずです。これで、1つのObjEntity:Productのみを作成します。しかし..どうすればフラットな関係を作成できますか?私はこれをフォローしています:http ://cayenne.apache.org/doc/cayennemodeler-flattened-relationships.htmlしかし、それ自体との関係であるためか、「ターゲット」コンボボックスでエンティティを選択できません。
ありがとうフランチェスコ
編集:2つのエンティティが異なる場合にも、ターゲットチェックボックスの問題があります。カイエンモデラーv.3.0.2
java - Apache Cayenne で新しいデータ オブジェクトを取得する
特定のテーブルで実行された各アクションをログに記録したい。列レベル(すべてではなく一部)でログを記録したいので、特定の列の値が変更された場合、たとえば.
製品 x の価格はユーザー U によって変更されました
(価格と製品が同じテーブルにあると仮定します。)
このために、製品 x の価格列を監視したいと考えています。
ユーザーもログに記録したいので、トリガーを使用してこれを行うことはできません。ユーザー情報 atm はポータル アプリケーションにあります (それをトリガーに渡すことはできません)。
現在、apache cayenne を使用しており、更新前 (エンティティ クラス内) のコールバックで、(ユーザーがポータルで選択した) 新しい価格をデータベースにある価格と比較したいと考えています。
データベースから製品を取得しようとすると、カイエンは新しいオブジェクトを返さず、値が変更された同じオブジェクトを返します
Cayenne が同じ pk(id) の新しいオブジェクトを返す方法を誰かが知っているかどうか疑問に思っていました (これは、db から新しいオブジェクトを取得するために使用しているものです)
また
別の方法でアドバイスできますか
java - Eclipse - インポートのトラブル
デバッグしようとしているプロジェクトがあり、Cayenne 3.2 を使用していると確信しています。cayenne 3.2 のソースをダウンロードしました。[インポート] -> [ファイル システム] -> を選択した後、cayenne のソースをプロジェクトとしてインポートしようとすると、ルート Cayenne ディレクトリまたはソースを持つサブ ディレクトリの 1 つを選択すると、「ソースは宛先の階層にあります。」と表示されます。Eclipse ではソースをインポートできません。それをインポートせず、例外が発生した場合、[ソース ルックアップの編集] をクリックしてソースを添付し、cayenne ルート ディレクトリまたはサブ ディレクトリの 1 つを選択すると、機能しません。Jar または zip ファイルを選択すると、コードが 1 秒間表示され、再び消えます。
誰でも修正を知っていますか?
apache-cayenne - 逆に生成されたオブジェクトを使用する場合のApacheCayenneのNoSuchFieldException
リモートクライアントからapachecayenneサーバーにselectをクエリすると、次の問題が発生します。
テストの目的で、1つのテーブルから1つの独立したクラスのみを生成しました。cleintクラス(スーパークラスとサブクラス)とServerクラスを生成しました。カイエンのチュートリアルにあるようにサーバーを起動しました。ログには、すべてが正常であることが示されています。今、私はカイエンのチュートリアルに示されているようにクライアントと接続しようとします:
それがラインになると:
次に、次のような例外が発生します:java.lang.NoSuchFieldException:id at java.lang.Class.getDeclaredField(Class.java:1899)at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:156)at org.apache.cayenne.reflect.FieldAccessor.lookupFieldInHierarchy(FieldAccessor.java:165)at org.apache.cayenne.reflect.FieldAccessor.prepareField(FieldAccessor.java:103)at org.apache.cayenne.reflect.FieldAccessor。(FieldAccessor .java:49)org.apache.cayenne.reflect.PersistentDescriptorFactory.createAccessor(PersistentDescriptorFactory.java:355)at org.apache.cayenne.reflect.PersistentDescriptorFactory.createAttributeProperty(PersistentDescriptorFactory.java:147)
それについてのクレイジーなことは、テーブル「ソース」を空にすると、すべてが正常に機能し、例外なく空のリストが返されることです。
また、クラスセット内の10個のオブジェクトすべてに対してクエリを実行でき、例外が常に選択したクラスの最初の属性にヒットすることもわかりません。これらのクラスを調べると、フィールドがあります。それらはカイエンモデラーが生成する抽象クラス内にあり、例外が与える正確な名前を持っています。
クライアントのソースクラスは次のとおりです。
}
これは対応するサーバークラスです。
}
カイエンのチュートリアルに示されているように、JettyWebサーバーでカイエンサーバーとクライアント3.0RC3を使用しています。
この例外が発生する理由を誰かが知っていますか?
java - Cayenne: cayenne によって生成されたクラスのインスタンスを手動で作成してデータベースを更新する
cayenne を使用して PostgreSQL データベースとやり取りしようとしています。これまでのところ、すべてが期待どおりに機能していましたが、よくわからない問題に悩まされています (カイエンは初めてです)。
通常のフィールド (book_id、title、editor、price) を持つテーブル「books」、著者 (author_id、author_name) の「テーブル」、リンク テーブル「books_authors」(book_id、author_id) があるとします。
本を追加または編集するプロセスに関連するすべてのクラスは、1 つの DataContext を共有します。
本を追加できる struts2 (速度テンプレートを使用) フォームがあり、ajax を使用して複数の著者が関連付けられています。特定のイベントに反応して、著者が存在するかどうかを検証する struts2 アクションを呼び出す ajax リクエストを起動し、Books_Authors オブジェクト (cayenne によって生成されたクラス) を struts2 セッションに追加します (アクションは SessionAware を実装します)。
フォームは次のようになります。
book のセッターとゲッターを持つ AddOrEditBook.do にフォームを送信すると、struts2 が book オブジェクトを作成し、フォームの値を入力します。それはすばらしい。
これは私を悩ませていることです:
本を更新するとき、struts によって作成されたオブジェクトを使用してデータベースを更新する方法が見つかりませんでした。私が達成したいのは、カイエンにストラットによって作成されたオブジェクトを使用してデータベース内の対応するエンティティを更新するように何らかの方法で指示することです。
object_id や PersistenceState などをいじりました。
cayenne を使用して db エンティティを更新する際の正しい戦略は何ですか? bookFromDb.setTitle(book.getTitle()); のようなものを作成することによってのみそれを行うことが可能ですか? ?
ありがとう!
sql-server - CayenneModelerによって認識されるドライバーのリストにドライバーを追加するにはどうすればよいですか?
私はApacheCayenneを初めて使用し、最初のプロジェクトを試しています。CayenneModelerの[ツール]>[データベーススキーマのリエンジニアリング]機能を使用して、SQLServerデータベースをリバースエンジニアリングしようとしています。
新しい「保存されたデータソース」を作成しようとしました。アダプターのリストから「org.apache.cayenne.dba.sqlserver.SQLServerAdapter」を選択すると、CayenneModelerがJDBCドライバーフィールドに自動的に入力し、サンプルのDBURLを追加しました。DB URLを変更し、ユーザー名/パスワードを入力して[続行]をクリックすると、次のエラーが発生します。
ドライバーの読み込みエラー:com.microsoft.sqlserver.jdbc.SQLServerDriver
これは、CayenneModelerにデフォルトでsqlserver用のドライバーがあることを意味すると思います(?)しかし、CayenneModelerを他のドライバーにポイントする方法がわかりません...
そこにいるカイエンの専門家は、私が間違っているかもしれないことを知っていますか?それが問題であると仮定して、CayenneModelerに必要なドライバーを与える方法はありますか?または、不足しているドライバーが問題ではない場合、誰かが何であるかを知っていますか?
tomcat7 - ApacheCayenneROPサーバー「リクエストに関連付けられたセッションがありません。」Tomcat7で
私は、Javaリッチクライアントとリモートオブジェクト永続サーバーを使用してカイエンプロジェクトを開発しています。私が金持ちのcientがローカルホスト上の同じマシンにデプロイされているCayenne-ROP-Serverに接続している場合(cayenne ropチュートリアルで説明されているようにMavenゴールからJettyに)すべてが正常です:
最初の行で接続するURLを非ローカルホスト(ubuntuのTomcat7)に変更すると、4行目になるまですべてが機能します。
次に、「リクエストに関連付けられたセッションがありません」というエラーが表示されます
クライアントの完全な出力は次のとおりです。
ApacheTomcatログのサーバー側の出力は次のとおりです。
Apache Cayenne 3.0.2、Apache-Tomcat 7.0.29、Java7SDKを使用しています
すべてのヘルプについて事前にTHX
PS。たぶん、ローカルのJettyサーバーは、リモートのUNIXマシン上のTomcatサーバーとは別の方法で処理します。
編集:以下の回答でAndrusによって与えられたヒントの後に、次のようなSessionListernを追加しました。
したがって、このlisternは、この質問の上に4行のコードstatetを実行すると、次の出力を返します。
ここでは、作成されるセッションがあり、強制終了されるセッションがないことがわかります。では、なぜ私のコード行からObjectContextを実行するのですか?
セッションを無視します。クエリを実行する前に明示的に設定する必要がありますか?リモートでデプロイされたcayenneサーバーにアクセスするためのクライアント側の標準の初期化コードは何ですか。カイエンropチュートリアルで与えられたものとは異なりますか?
事前にTHX。
編集:このエラーを取り除くことを望んでカイエン3.1B1にアップグレードしましたが、クエリを送信しようとしたときの同じ状況:「セッションなし...」。
また、ローカルホストにTomcatをセットアップし、リモートと同じように構成しました。クエリを送信しようとすると、ここで「セッションがありません...」と同じ問題が発生します。
したがって、ローカルホスト上のJettyは、上から4行の初期化コードを取得し、後続のすべてのクエリのセッションを保持する唯一のJettyです。これが私の質問です。この惑星の誰かがTomcatにカイエンropサーバーをデプロイしようとして成功したことはありますか?
すべての小さなヒントのために事前にTHX。
編集:それで、ローカルtomcat7でサーバー側のデバッグを少し行いました。
1.クライアントは上記のコードの2行目を実行します。
サーバーサイドでセッションリスナーがトリガーされ、IDがB6565298F222294F601B76333DBE4911でセッションが作成されたことが通知されます。
2.クライアントは上から3行目を実行します。
サーバー側では、クラスorg.apache.cayenne.remote.service.HttpRemoteSessionのメソッドが呼び出されます。
このメソッドの1行目で新しいセッションが作成されます。そのIDはECC4A81D6240A1D04DA0A646200C4CE6です。この新しいセッションには、属性が1つだけ含まれています。キーは「org.apache.cayenne.remote.service.HttpRemoteService.ServerSession」で、値は(誰が推測したのですか?)ステップ1で前に作成したセッションです。新しいセッションが作成されても、serveltListenerはトリガーされません。
3.クライアントは4行目を上から実行します
サーバーサイドでは、getServerSession()メソッドが再度呼び出されます。今回も新しいセッションが作成されます(なぜですか?)。また、このセッションには属性が含まれていません。したがって、「return(ServerSession)httpSession.getAttribute(SESSION_ATTRIBUTE);」という行があります。メソッド内でgetServerSession()はnullを返し、これにより「リクエストに関連付けられたセッションがありません」という例外がトリガーされます。
では、なぜカイエンのサーバーサイドがe neセッションを作成し、以前に作成された古いセッションを使用しないのでしょうか。クエリ内でセッションを明示的に送信する必要がありますか?
編集:上から4行のコードを実行しながら、netbeanshttp-monitorからスクリーンショットを作成しました。
java - struts2がセッションオブジェクトを作成する理由と時期は?
Web アプリケーションでユーザーが正常に認証された場合にのみセッションを作成したいと考えています。しかし、ログインページにアクセスしただけなのに、何らかの理由で struts2 がセッションオブジェクトを作成します。
struts2 のドキュメントをいくつか調べたところ、struts.custom.i18n.resources を使用するとセッションが作成される可能性があることがわかりました。そのため、struts.xml ファイルから削除しました。しかし、私のWebアプリケーションでセッションが作成されているにもかかわらず.
これに関するヘルプ/考えは本当に感謝しています。
更新された質問
Cayenne データ コンテキストを操作するために、web.xml に次の行がありました。
これにより、Web アプリケーションでセッションが作成されますか?
-ナレンドラ
java - Cayenneが一部の列の値を更新するのを防ぐ
cayenneの一部の列値を更新したくないのですが、それらを挿入したいと思います。行を挿入すると、一部の列の値を更新したくなくなります。カイエンでこれを行うにはどうすればよいですか。マッピングファイルで休止状態の場合は、何かを指定できます
カイエンマッピングファイルで上記のものを指定するにはどうすればよいですか。これに関するどんな助けも本当にありがたいです。
-ナレンドラ
java - テーブルの PK のみを取得する方法
MySQL DBの下で、Java Apache Cayenneを使用しています。単一の bigint PK といくつかのフィールドを持つ非常に大きなテーブルがあります。リソースを消費しすぎるため、このエンティティをマップするすべてのオブジェクトではなく、PK 値のみを取得したいと考えています。
すべてのオブジェクトを取得するこのスニペットの代わりに使用できるスニペットはありますか?