質問

更新:例解明 かけの一例で起こっていることで、状況を明らかにすっ春+Hibernateます。想像しているこの二つの主体とsetterか、セッターが存在するもの)

@Entity
public class Class1(){
  private Integer id;

  @OneToOne
  private Class2 object2;
}

@Entity
public class Class2(){
  private Integer id;

  @OneToOne
  private Class1 object2;
}

なので私のデータベースがうまくいきませんのテーブルマ毎のインスタンスの各オブジェクトです。ることもあってデータベースに格納されこれらのオブジェクト:

  • objectA(クラス1):id=1,object2=objectB
  • objectB(クラス2):id=2のとobject2=objectA
  • objectC(クラス2):id=3,object2=nullの場合 るanb B"は同義語だったのです。っていきたいリンクobjectAにobjectC.としていまへのリンクを削除し、objectBます。

この操作を行いますfolowing:

//I get the objectA from database
Class1 storedObjectA = myservice.find(objectAId);
//Now in storedObject1 I have the same as what it is stored as objectA

//I change only the object2 attribute of it
storedObject1.setObject2(objectC);

//I search again in the database to see objectA
Class1 reStoredObjectA = myservice.find(objectAId);

restoredObjectAは:

  • restoredObjectA(class=Class1)id=1,object2=objectC

いかにもデータベースがあり:

  • restoredObjectA(class=Class1)id=1,object2=objectB

の方法を見いないデータベースから検索し、頂いており、前検索をしたが私のクエリ秒レベルのキャッシュ無効になります。方法を見つけるのDAOで実行のentityManager.find(Class1.class id) どうして私を見searchsのデータベース?

感謝


(説明)

こんにちは,

いに対応したアプリケーションを使泉3Hibernate.私は企業名をクラス1であるデータベース化されている。このエンティティはOneToOneへのリンクは他の事業体というクラス2.クラス2がOneToOneのリンクをクラス1、リンクに独自のプロパティを設定します。

いては、下記コードを私がコントローラ:

//I have an object called dataFromUser which is instance of Class1 and
// it is obtained via @ModelAttribute annotation from a form

Integer id = dataFromUser.getId();

//I get correctly the stored object from the database
Class1 storedData = myService.find(id); //this will call em.find of hibernate

//I set to the stored data the attribute I want to change
storedData.setObject2();

//I save again the object
myService.save(storedData);

の方法で保存しmyServiceの体長を持続し、データがこのチェック前とクラス1オブジェクトとクラス2オブジェクトを削除すると、新しいクラス2のオブジェクトの設定インスタンスのクラス1.そのためにしています呼べ方を再度見からのデータベース

サービス:

@Transactional
public void save(Class1 object1){
   Class1 objectFromDB =  myDAO.find(object1.getId());
   // ....  update the old object and save
}

問題はobjectFromDBのサービスはないんだときと同じっmyService.find(id)にコントローラ部でします。問題はでないのデータベースで検索す。ただ、それがないSQL文をログイン時のfind()メソッドが呼び出されます。私たsetObject2()をstoredDataオブジェクトを取得しまうこのオブジェクトが呼び出を見る方法には、データベースが含まれていないこなって続きます。

また、キャッシュを無効に自分の設定だけを試し、まだ起きています。いehCacheこのように構成:

にpersistence.xml 私はこの物件してくれてありがとうございますfalseに設定の両方のキャッシュ):

    <properties>
     <!-- Hibernate 3.5.0 - try org.hibernate.cache.* package -->
  <property name="hibernate.cache.provider_class"
               value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" />
   <property name="hibernate.cache.use_query_cache" value="false" />
  <property name="hibernate.cache.use_second_level_cache" value="false" />
  <property name="hibernate.generate_statistics" value="true" />
  <property name="hibernate.cache.use_structured_entries" value="false" />
  <property name="hibernate.format_sql" value="true" />
  <!-- http://www.jroller.com/eyallupu/entry/hibernate_s_hbm2ddl_tool -->
  <!-- create, create-drop, update, validate -->
  <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>  

私のehcache.xml 私は0に設定さmaxElementsInMemoryとoverflowToDiskて表示されるようになっています。

がこうした事態を避けるために?

感謝。

役に立ちましたか?

解決 2

OKを見たいのです。問題は、hibernate見のためのオブジェクトはその前のセッションデータベースの検索.何年経っても色あせない素敵なる一戸建てのオブジェクトのセッションの前に変更します。なhibernate:

    //being em my EntityManager instance
    Session session = (Session) em.getDelegate();
    session.evict(plan); 
    //Now the find object will not get the object wich is in session 
    //but the one in database

他のヒント

なんなのか理解し正しくで...


があり 二つのメソッドをオブジェクト.に差がある場合、オブジェクトの現在のメモリコンテクスト:

  • 一人ずつ確かなのは、データベースを返しますインスタンスが存在していればそうでない場合はnull.
  • その他単にプロキシを作成し、正しいidをせず、すぐにデータベースは、ございますので、ご留意ください必要以降の操作る時にフラッシング).

まうので、もしかしたらできるように見れば解決の問題を?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top