2
public class Application{
   @Id
   private Long id;

   @OneToMany(mappedBy = "application")
   private List<Licence> licences = new ArrayList<Licence>();
   ...
}

public class Licence{
   @Id
   private Long id;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "ID", nullable = false)
   private Application application;
   ...
}

em.merge(application);に移動するときに、ライセンスを読み取り専用に残し、ライセンスを永続化しようとしないように休止状態にする方法を教えてください。

アプリケーションでカスケードを使用してライセンスを保存しようとはしていません。ライセンスには、実際に永続化される前に実行するビジネスルールがたくさんあるため、各ライセンスで個別にpersistを呼び出します。これを行うにはどうすればよいですか?これは、永続化では正常に機能しますが、マージでは機能しません。

マージ時に私は取得し続けます

org.hibernate.TransientObjectException: object is an unsaved transient 
     instance - save the transient instance before merging: com.cmr.Licence
4

2 に答える 2

6

を使用しinsertable = false, updatable = falseます。これを更新

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ID", nullable = false)
  private Application application;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ID", nullable = false, insertable = false, updatable = false)
  private Application application;
于 2012-10-10T03:17:00.280 に答える
0

ライセンスからアプリケーションへの一方向の関係。変更する必要があるもの

  1. アプリケーションでOneToMany関係を削除します
  2. ライセンス側では、

     @Column(nullable = false, insertable = false, updatable = false)
     private Long application_id;
    
     @ManyToOne(optional = false)
     @JoinColumn(name = "application_id")
     private Application application;
    
     Test:
     em.persist(application) -- should be ok. 
     em.persist(licence) - not null voilation
    
     licence.setApplication(application)
     em.persist(licence) - should be ok
    

上記を使用すると、ライセンスなしでアプリケーションを保存できます。ただし、アプリケーションなしでライセンスを保存することはできません。テスト済み、動作します。

-マディ

于 2012-10-10T10:37:02.310 に答える