タグ付けされた質問 「hibernate」

HibernateはJava言語用のオブジェクトリレーショナルマッピング(ORM)ライブラリであり、開発者はアプリケーションでPOJOスタイルのドメインモデルをオブジェクト/リレーショナルマッピングをはるかに超える方法で利用できます。

1
enumをhibernateの文字列にマッピングする
私はカテゴリ休止モデルを持っています: @Entity @Table(name = "category") public class Category { @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "id") private long id; @Column(name = "type") private String type; タイプ文字列フィールドがあります。また、カテゴリのタイプを表すJava列挙型も用意しています。 public enum CategoryType { INCOME, OUTCOME; } 文字列型の代わりに使用したい。SQLは、varcharパラメータで2つの異なる値(CategoryIncomeまたは)を受け入れますCategoryOutcome。カテゴリモデルクラスが列挙型変数を受け入れて、休止状態が要求するたびに何らかの方法で文字列にマッピングしたいと思います。 出来ますか?
92 java  hibernate  enums 

7
名前がJPAの予約語であるエンティティフィールドをマップする方法
@Column(name="open") Hibernateでsqlserverダイアレクトを使用する。 [SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid)) [SchemaUpdate] Incorrect syntax near the …

11
Hibernate:すべてのレイジーコレクションをプルするためのベストプラクティス
私が持っているもの: @Entity public class MyEntity { @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "myentiy_id") private List<Address> addreses; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "myentiy_id") private List<Person> persons; //.... } public void handle() { Session session = createNewSession(); MyEntity entity = (MyEntity) …

8
Spring Data JPAでFetchModeが機能する仕組み
プロジェクトの3つのモデルオブジェクト(投稿の最後にあるモデルとリポジトリのスニペット)の間に関係があります。 私が呼び出すPlaceRepository.findByIdと、3つの選択クエリが実行されます。 ( "sql") SELECT * FROM place p where id = arg SELECT * FROM user u where u.id = place.user.id SELECT * FROM city c LEFT OUTER JOIN state s on c.woj_id = s.id where c.id = place.city.id これはかなり珍しい動作です(私にとって)。Hibernateのドキュメントを読んだ後、私が知る限り、常にJOINクエリを使用する必要があります。クラス(SELECTを追加したクエリ)にFetchType.LAZY変更し FetchType.EAGERた場合のクエリに違いはありません。Placeクラス(JOINを使用したクエリ)CityにFetchType.LAZY変更した 場合も同様ですFetchType.EAGER。 CityRepository.findById火の抑制を使用すると、2つの選択が行われます。 SELECT * FROM city c where …

20
休止状態エラー:同じ識別子の値を持つ別のオブジェクトがすでにセッションに関連付けられています
この構成には基本的にいくつかのオブジェクトがあります(実際のデータモデルは少し複雑です)。 AはBと多対多の関係にあります(Bはinverse="true") BはCと多対1の関係にあります(私はにcascade設定しました"save-update") Cは、タイプ/カテゴリテーブルの一種です。 また、保存時にデータベースによって主キーが生成されることにも言及する必要があります。 私のデータでは、Aに一連の異なるBオブジェクトがあり、これらのBオブジェクトが同じCオブジェクトを参照している場合に問題が発生することがあります。 を呼び出すとsession.saveOrUpdate(myAObject)、休止エラーが表示されます"a different object with the same identifier value was already associated with the session: C"。hibernateは同じセッションで同じオブジェクトを2回挿入/更新/削除できないことを知っていますが、これを回避する方法はありますか?これは、それほど珍しい状況ではないようです。 この問題の調査中に、人々がの使用を提案するのを見てきましたがsession.merge()、その場合、「競合する」オブジェクトはすべての値がnullに設定された空白のオブジェクトとしてデータベースに挿入されます。明らかにそれは私たちが望んでいることではありません。 [編集]言及し忘れたことのもう1つは、(私の制御の及ばないアーキテクチャ上の理由から)読み取りまたは書き込みをそれぞれ別のセッションで行う必要があることです。
91 java  hibernate 

4
アノテーション@Transactional。ロールバックする方法は?
このアノテーションをDaoクラスにうまく使用しました。そして、ロールバックはテストで機能します。 しかし今は、テストだけでなく実際のコードをロールバックする必要があります。テストで使用する特別な注釈があります。しかし、どの注釈が非テストコード用ですか?それは私にとって大きな問題です。私はすでにそのために一日過ごしました。公式ドキュメントは私のニーズを満たしていませんでした。 class MyClass { // this does not make rollback! And record appears in DB. EmployeeDaoInterface employeeDao; public MyClass() { ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "HibernateDaoBeans.xml" }); employeeDao = (IEmployeeDao) context.getBean("employeeDao"); } @Transactional(rollbackFor={Exception.class}) public void doInsert( Employee newEmp ) throws Exception { employeeDao.insertEmployee(newEmp); throw new RuntimeException(); …
91 java  hibernate  spring 

10
JPA(および対応する結合テーブルの行)でManyToMany関係を持つエンティティを削除するにはどうすればよいですか?
GroupとUserの2つのエンティティがあるとしましょう。すべてのユーザーは多くのグループのメンバーになることができ、すべてのグループは多くのユーザーを持つことができます。 @Entity public class User { @ManyToMany Set<Group> groups; //... } @Entity public class Group { @ManyToMany(mappedBy="groups") Set<User> users; //... } グループを削除したいと思います(メンバーが多いとしましょう)。 問題は、あるグループでEntityManager.remove()を呼び出すと、JPAプロバイダー(私の場合はHibernate)が結合テーブルから行を削除せず、外部キーの制約のために削除操作が失敗することです。Userでremove()を呼び出すと、正常に機能します(これは、関係の所有側と関係があると思います)。 では、この場合、どうすればグループを削除できますか? 私が思いつく唯一の方法は、グループ内のすべてのユーザーをロードしてから、すべてのユーザーについて現在のグループをグループから削除し、ユーザーを更新することです。しかし、このグループを削除できるようにするためだけに、グループのすべてのユーザーに対してupdate()を呼び出すのはばかげているようです。
91 java  hibernate  jpa  orm 

6
Spring Data JPAは、ネイティブクエリ結果を非エンティティPOJOにマップします
ネイティブクエリを使用したSpringDataリポジトリメソッドがあります @Query(value = "SELECT g.*, gm.* FROM group g LEFT JOIN group_members gm ON g.group_id = gm.group_id and gm.user_id = :userId WHERE g.group_id = :groupId", nativeQuery = true) GroupDetails getGroupDetails(@Param("userId") Integer userId, @Param("groupId") Integer groupId); 結果を非エンティティPOJOにマップしたいと思いGroupDetailsます。 それは可能ですか?もしそうなら、例を挙げていただけますか?

4
いつ、どのようにHibernate 2次キャッシュを使用するのですか?
hibernateが2番目のレベルのキャッシュにヒットするタイミングと、キャッシュが無効になるタイミングを理解できません。 これは私が現在理解していることです: 2次キャッシュはセッション間のエンティティを保存します。スコープはSessionFactoryです キャッシュするエンティティを指定する必要があります。デフォルトでは、エンティティはキャッシュされません。 クエリキャッシュは、クエリの結果をキャッシュに保存します。 わからないのは 休止状態はいつこのキャッシュにヒットしますか? 2番目のレベルのキャッシュを設定したが、クエリのキャッシュは設定していないとしましょう。顧客をキャッシュしたいのですが、50000あります。どのようにしてキャッシュから顧客を取得できますか? キャッシュからIDで取得できると思います。それは簡単ですが、キャッシュする価値もありません。しかし、もし私がすべての顧客と何らかの計算をしたいとしたらどうでしょう。顧客のリストを表示したい場合、どうすれば顧客にアクセスできますか? クエリキャッシュが無効になっている場合、どのようにすればすべての顧客を獲得できますか? 誰かが顧客の1人を更新するとどうなりますか? その顧客はキャッシュで無効になりますか、それともすべての顧客が無効になりますか? それともキャッシュが完全に間違っていると思いますか?その場合、2次キャッシュのより適切な使用法は何でしょうか?hibernateのドキュメントでは、キャッシュが実際にどのように機能するかはまったく明確ではありません。それをセットアップする方法についての指示だけがあります。 更新: したがって、2番目のレベルのキャッシュ(クエリキャッシュなし)がIDでデータをロードするのに適していることを理解するようになりました。たとえば、Webアプリケーションのすべてのリクエストでパーミッションをチェックしたいユーザーオブジェクトがあります。これは、2次キャッシュにユーザーをキャッシュすることでデータベースアクセスを削減する良い例でしょうか?セッションまたはどこにでもユーザーIDを格納するように、アクセス許可を確認する必要がある場合は、IDでユーザーを読み込み、アクセス許可を確認します。

6
Log4j XML構成ファイルを使用してHibernateロギングを構成しますか?
Log4jのXMLスタイルの構成ファイルを使用してHibernateのロギングを構成する方法に関するドキュメントを見つけることができませんでした。 これは可能ですか、またはプロパティスタイルの構成ファイルを使用してHibernateのログを制御する必要がありますか? 誰かが情報やドキュメントへのリンクを持っている場合は、それをいただければ幸いです。 編集: 明確にするために、私はHibernateを制御する実際のXML構文の例を探しています。 EDIT2: これが私のXML構成ファイルにあるものです。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Threshold" value="info"/> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c{1} - %m%n"/> </layout> </appender> <appender name="rolling-file" class="org.apache.log4j.RollingFileAppender"> <param name="file" value="Program-Name.log"/> <param name="MaxFileSize" value="1000KB"/> <!-- Keep one …

7
org.hibernate.PersistentObjectException:永続化するために渡されたデタッチされたエンティティ
私は最初のマスターチャイルドの例をhibernateでうまく作成しました。数日後、私はそれを再び取り、いくつかのライブラリをアップグレードしました。何をしたのかわかりませんが、二度と実行させることはできませんでした。次のエラーメッセージを返すコードの何が問題なのかを誰かが理解するのを手伝ってくれるでしょうか。 org.hibernate.PersistentObjectException: detached entity passed to persist: example.forms.InvoiceItem at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:127) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:799) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:791) .... (truncated) Hibernateマッピング: <hibernate-mapping package="example.forms"> <class name="Invoice" table="Invoices"> <id name="id" type="long"> <generator class="native" /> </id> <property name="invDate" type="timestamp" /> <property name="customerId" type="int" /> <set cascade="all" inverse="true" lazy="true" name="items" order-by="id"> <key column="invoiceId" /> <one-to-many class="InvoiceItem" /> </set> …
89 hibernate 

4
JpaRepositoryDML操作ではサポートされていません[クエリの削除]
インターフェース拡張の一部のオブジェクトを削除するクエリを作成しましたが、クエリJPaRepositoryを実行すると例外がスローされます。誰かが私のためにそれを説明できますか? クエリ: public interface LimitRepository extends JpaRepository<CLimit, Long> { @Query("delete from CLimit l where l.trader.id =:#{#trader.id}") void deleteLimitsByTrader(@Param("trader") CTrader trader); } 私はこのエラーを受け取りました、誰でもできます、私のためにこれを説明してください、そしてすべてに感謝します:) 例外: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.query.domain.CLimit l where l.trader.id =:__$synthetic$__1] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:318) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:369) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300) at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495) …

8
Hibernate:session.getとsession.loadの違い
APIから、プロキシと関係があることがわかりました。しかし、私は、プロキシ上で多くの情報を見つけることができなかったと呼び出しの違いを理解していないsession.getとしますsession.load。誰かが私を説明したり、参照ページに案内したりできますか? ありがとうございました!!

15
Hibernate-シーケンスは存在しません
春の4.2バージョンを使用して、プロジェクトでHibernateを4から5にアップグレードしようとしました。このアップグレード後、更新メソッドを呼び出したときに、スタックトレースに次のエラーが見つかりました。 10:53:32,185 ERROR TableStructure:149 - could not read a hi value com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.hibernate_sequence' doesn't exist アノテーション付きの自動インクリメントIDを変更しました @GeneratedValue(strategy=GenerationType.AUTO) それでもエラーは残ります。
88 java  spring  hibernate 

3
Hibernateの遅延ロードアプリケーションの設計
私はHibernateをSpringフレームワークと組み合わせて使用する傾向があり、それは宣言型のトランザクション境界機能(@Transactionalなど)です。 誰もが知っているように、休止状態はできるだけ非侵襲的で透明性を保つように努めていますが、関係を採用する場合、これは少し難しいことがわかりますlazy-loaded。 透明度のレベルが異なるデザインの選択肢がいくつかあります。 関係を遅延ロードしないようにします(例: fetchType=FetchType.EAGER) これは、遅延読み込みのアイデア全体をバイオライトします。 を使用してコレクションを初期化する Hibernate.initialize(proxyObj); これは、DAOへの比較的高い結合を意味します でインターフェースを定義することはできますがinitialize、他の実装が同等のものを提供することは保証されていません。 永続Modelオブジェクト自体にトランザクション動作を追加します(動的プロキシまたはを使用@Transactional) @Transactionalが永続オブジェクト自体で機能するようには見えませんでしたが、動的プロキシアプローチを試したことはありません。おそらくその休止状態が原因で、プロキシでの操作が行われています。 トランザクションが実際に行われているときの制御の喪失 両方の怠惰/非怠惰なAPIを提供し、例えば、loadData()およびloadDataWithDeps() アプリケーションに、どのルーチンをいつ使用するかを強制的に認識させます。これも密結合です。 メソッドオーバーフローloadDataWithA()、、 ....、loadDataWithX() byId()操作 のみを提供するなどして、依存関係のルックアップを強制します 非オブジェクト指向のルーチン、例えば、の多くを必要とfindZzzById(zid)し、その後getYyyIds(zid)の代わりに、z.getY() トランザクション間に大きな処理オーバーヘッドがある場合は、コレクション内の各オブジェクトを1つずつフェッチすると便利です。 DAOだけでなく、アプリケーションの一部を@Transactionalにします。 ネストされたトランザクションに関する考えられる考慮事項 トランザクション管理に適合したルーチンが必要です(例:十分に小さい) プログラムによる影響は小さいが、トランザクションが大きくなる可能性がある DAOに動的フェッチプロファイルを提供します。loadData(id, fetchProfile); アプリケーションは、いつ使用するプロファイルを知っている必要があります AoPタイプのトランザクション。たとえば、操作をインターセプトし、必要に応じてトランザクションを実行します。 バイトコード操作またはプロキシの使用が必要 トランザクションが実行されるときの制御の喪失 いつものように、黒魔術:) オプションを逃しましたか? lazy-loadedアプリケーション設計における関係の影響を最小限に抑えるために、どのアプローチをお勧めしますか? (ああ、WoTでごめんなさい)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.