2011-12-15 4 views
0

私は人物オブジェクトとコンピュータオブジェクトを持っています。 この人物オブジェクトはコンピュータという名前のフィールドがあり、1人は1台のコンピュータと1対1の関係を持つことができます。カスケードタイプ:ALL、MERGEなど

class Person{ 

    @OneToOne(cascade=CascadeType.ALL)//in which situations this is true? 
    @JoinColumn(name = "computer_id",nullable=false) 
    private Computer computer; 

    getComputer(){...} 
    setComputer(Computer c){...} 

    @Id 
    private String id; 
} 

class Computer{ 

    @Id 
    private String id; 

} 

私はDB上にコンピュータオブジェクトを持っていると仮定してください。私はそれをロードメソッドで取得します。

Computer computer=entityManager.loadById({an id}); 
Person p=new Person(); 
p.setComputer(computer); 

ここで、コンピュータと人の両方を保存したい場合、どうすればよいですか?

entityManager.persist(p); 

私は同じエラーを生成することはできませんが、しばらく前に、「分離されたエンティティを継承して渡す」エラーが発生しました。

リピートせずにすべてをDBに保存する最も適切な方法は何ですか?

さまざまな状況で何をすべきかを理解するために、リソース(書籍かもしれません)にアドバイスすることもできます。あなたが記述した場合に任意のカスケードを必要とし、ユーザーを永続化することは十分でありません

答えて

3

  • コンピュータはEMを使用してロードされているので、それがEMに添付ます。コンピュータ上で行われた変更は、操作を必要とせずに自動的にデータベースに保存されます。
  • ユーザーはまだ新しいものではありません。永続化するには、persistに電話する必要があります。この呼び出しの後、EMに接続され、ユーザーに対して行われた変更も、操作なしでデータベースに自動的に保存されます。

エラーが発生した場合、新しいコンピュータを作成し、新しいユーザーを作成し、コンピュータをそのユーザーに設定して、そのユーザーを永続させます。この場合、永続的でない別のエンティティ(コンピュータ)を参照する永続エンティティ(ユーザ)を作成しようとしているため、EMは賛成です。 2つの解決策があります

  • コンピュータ
  • persistを呼び出すことにより、コンピュータが永続化されるように、カスケード=とperson.computer協会は、持続または= ALLカスケード注釈を付け、ユーザーが永続行う前に、コンピュータを永続化ユーザーが永続化されたときに自動的に表示されます。 ALLにはREMOVEも含まれています。そのため、ユーザーを削除すると、そのコンピュータも削除されます。
+0

返信いただきありがとうございます。私は "永続的な"消えて、尋ねたい。あなたはそれが変更した後に私は永続と呼ぶと、それはdbに行くときまで言ったが、いつまで?何の後でも、私のオブジェクトは永続性を失います。たとえば、次のようなメソッドがあります。 'public Computer foo(){Computer c = new Computer(); (); '' Person person = new Person(); '' Person' = new Person(); person.add(comp); em.persist(person); ' – merveotesi

+0

エンティティがデタッチされるまで、つまりこれらのコールを取り囲むトランザクションがコミットまたはロールバックされるまで。エンティティをシリアライズしてデシリアライズすると、結果のエンティティもデタッチされます。 –