2009-08-25 5 views
0

に基づいてシーケンスを作成する私は、私が何をしようとしているいくつかの規準

@Entity 
public class Foobar { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @ManyToOne 
    private Organization organization; 

    private Long orderNr; 
} 

は、このオブジェクトのインクリメント注文番号を作成することです以下のクラスを持っています。問題はorderNrが組織ごとに一意であることです。たとえば、2つの組織(org1とorg2と呼ぶ)があるとしましょう。まず、Foobarのインスタンスを作成し、組織をorg1に設定します。保存すると、orderNrの値は '1'にな​​ります。次に、Foobarの別のインスタンスを作成し、組織をorg1に再度設定します。 orderNrは値 '2'を取得するはずです(Foobarのこの特定のインスタンスの場合、最初のFoobarは値 '1'を保持する必要があります)。次にFoobarのインスタンスをもう1つ作成しますが、今度は組織をorg2に設定します。これはorg2の最初のオブジェクトであるためorderNrは値 '1'を取得する必要があります。

これを達成する最も簡単な方法は何ですか? JPAやHibernateに(注釈を使って)これを簡単にやり遂げることができるものはありますか、あるいは手動でカウンタ値を追跡しなければなりませんか?

==== 質問が誤解されたために編集しました。

+3

カウンタ?foobarのクラスに編成して行うためにすべてを宣言し、組織に固有のはなぜ組織クラスにする必要があります。 カウンタ私にはあなたたちが誤解foobarに –

答えて

0

まず、カウンタの値を「保存時」に設定する必要がある理由は何ですか?それは厳しいだろう。代わりに、組織をFoobarに接続する時点で値を設定したいと思うでしょう。

第2に、ポール・キブル(Paul Keeble)がコメントで述べたように、はい、この値は組織に関連しているように見え、そのクラスにも属しています。

Foobarsを組織に関連付ける方法を作成する必要があります(単純にメンバー変数を設定するのではなく)。このメソッドはカウンタを設定する必要があります。 foob​​arの中のSO :

 
    public void associateWithOrganization (Organization org) { 
     this.organization = org; 
     org.addAssociation (this); 
    } 

と組織内:

 
    public void addAssociation (Foobar foo) { 
     this.associationCounter ++; 
    } 
    ... 

はまた、当然のことながら、 "getNumberOfAssociationsForThisOrganization()" と "removeAssociation(この)" メソッドが必要になります。

+0

のプロパティのような音はありません私はそれをひどく名づけたので、もちろんカウンターの目的です。カウンターは「組織内にどれくらいのFoobarsがあるのか​​」とは言わないが、組織のFoobarのオーダー番号ではなく、「これは組織Xの3番目のFoobarだから」フーバー(組織にはない) –

0

私はそれを得ました。コメントにもかかわらず、orderNrは実際にOrganizationではなくFoobarに属します。

しかし、これは別の方法で実装する必要があると思います。私はHibernateがあなたが望むものを直接サポートしているとは思わない。容易に、少なくとも。

タイムスタンプをFoobarに追加します。このタイムスタンプは、インスタンスが作成された時刻を保持します。その後、あなたはさらに

"SELECT COUNT (*) FROM Foobar WHERE organization = :myOrg AND timestamp < :myTimeStamp" 

ようなクエリを実行することによって、実際のorderNrを見つけることができる、私はおそらくOrganization@OneToMany(mappedBy = "organization")でそれをマッピングすることで、List<Foobar>(すなわちを持っていなければならないと思います。もちろん、おそらくあなたがそれを必要としません。

関連する問題