2011-09-30 31 views
1

私は休止状態で作業し、挿入時に一意のデータメンバーを強制する問題が生じていますユニークなデータメンバーに強制します。ここで休止状態:

は私の簡略エンティティオブジェクトは、次のとおりです。

ワークフロー:

@Entity 
public class Workflow { 

    private long wfId; 

    private Set<Service> services; 

    /** Getter/Setter for wfId */ 
    ... 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "workflow_services", 
     joinColumns = @JoinColumn(name = "workflow_id"), 
     inverseJoinColumns = @JoinColumn(name = "service_id")) 
    public Set<Service> getServices() { 
     return services; 
    } 

サービス:

@Entity 
public class Service { 

    private long serviceId; 
    private String serviceName; 

    /** Getter/Setter for serviceId */ 
    ... 

    @Column(unique=true,nullable=false) 
    public String getServiceName() { 
    return serviceName; 
    } 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "service_operations", 
     joinColumns = { @JoinColumn(name = "serviceId") }, 
     inverseJoinColumns = { @JoinColumn(name = "operationId") }) 
    public Set<Operation> getOperations() { 
     return operations; 
    } 

操作:

@Entity 
public class Operation { 

    private long operationId; 
    private String operationName; 

    /** Getter/Setter for operationId */ 

    @Column(unique=true,nullable=false) 
    public String getOperationName() { 
     return operationName; 
    } 

私の問題:

私はそれぞれのオブジェクトにSUPPOSEDが何であるかを述べていますが、それは強制されていません。

は私のワークフローオブジェクトの内部では、私は一連のサービスを維持します。各サービスは、操作のリストを維持します。ワークフローは、データベースに保存されている場合、私はそれが現在使用してサービスや操作がデータベースにすでにある場合はそうならば、それはそれらの行で、関連付け自体をチェックする必要があります。

は現在、私は私のサービスおよびオペレーションテーブル内の反復を取得しています。

私は、アノテーションを使用して試してみました: @Table(uniqueConstraints)

をそれでゼロ運を持っていました。

すべてのヘルプは大一意またはuniqueConstraints属性がDBに一意性を強制するために使用されていますが、あまりにも休止状態(およびドキュメンテーションのためにそれを生成した場合、正しいDDLを作成しますが、それは議論の余地のですされていない

+0

どのデータベースと方言を使用していますか?データベースにテーブルをどのように作成しましたか? hbm2ddl?あなたのテーブルを生成するために使用されたクエリを表示できますか? hibernateは一意性チェック自体はしないと思っていますが、データベースに固有の制約があるテーブルが生成されるはずです。 –

答えて

0

をいただければ幸いです)。あなたが休止状態のようにユニークな何かを宣言する場合

することは、あなたは制約を加えることで、DBにもそれを宣言する必要があります。

極端に言えば、PKがDB内で一意ではないマッピングを作成することができ、Session.loadを呼び出してアイテムをロードしようとすると、hibernateは例外をスローし、 2項目です。

0

私のワークフローオブジェクトの中で、私はサービスのセットを維持します。各サービスは、操作のリストを維持します。ワークフローをデータベースに保存するときに、現在使用しているサービスと操作がデータベースに既に存在するかどうかを確認する必要があります。

私はイエス、あなたがセットにそれらを追加するときに重複したオブジェクトを検出するためにHibernateを求めていると思います?言い換えれば、Setにオブジェクトを置くと、Hibernateはそのオブジェクトの永続的なバージョンを探してそれを使用します。しかし、これはHibernateが動作する方法ではありません。オブジェクトを「再利用」したい場合は、自分でそれを調べてから使用する必要があります。 Hibernateはこれをしません。

私は、親オブジェクトと子オブジェクトをとり、参照と設定を行うDAOのようなオブジェクトにヘルパーメソッドを持たせることをお勧めします。

+0

これは私が今作業していることです。私の問題は、Hibernateがオブジェクトを再追加しようとしてエラーをスローし、「重複キー」エラーが発生していることです。 私は 'session.saveOrUpdate(workflow)'を使っていますが、それはワークフロー自体であり、そのサブ要素ではないと思います。すなわちサービスと操作。 何か考えていますか? –

+0

分離したオブジェクトをワークフローオブジェクトに設定しているようです。あなたはサブオブジェクトを(クエリ、IDなどで)取り出し、*同じセッションで*それらを対応するセットに加え、親オブジェクトを保存する必要があります。カスケーディングが適切に設定されている限り、Hibernateはサブオブジェクトで「正しいことをする」必要があります。それは理にかなっていますか? – Mac