2009-08-25 44 views
0

序列我有下面的類創建基於一些準則

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

    @ManyToOne 
    private Organization organization; 

    private Long orderNr; 
} 

我試圖做的是創建此對象的遞增順序號。問題在於orderNr對於每個組織都應該是唯一的。例如,假設我們有兩個組織(讓我們稱它們爲org1和org2)。首先,我們創建一個Foobar實例並將組織設置爲org1。保存後,orderNr的值應該變爲'1'。然後,我們將創建另一個Foobar實例,並再次將組織設置爲org1。 orderNr現在應該得到值'2'(對於Foobar的這個特定實例,第一個Foobar應該仍然具有值'1')。然後我們創建Foobar的另一個實例,但是這次我們將組織設置爲org2,現在orderNr應該得到值'1',因爲這是org2的第一個對象。

完成此操作的最簡單方法是什麼? JPA或Hibernate中有什麼可以讓我輕鬆地做這樣的事情(通過使用註釋)還是我必須手動跟蹤計數器值?

==== 作了一些編輯,因爲這個問題被誤解了。

+3

爲什麼在Foobar的類?一切與一個組織,以及獨特的組織計數器宣稱應在組織類。 計數器對我聽起來不像的Foobar的屬性 –

回答

0

首先,你爲什麼說計數器值應該設置爲「保存」?這將是艱難的。相反,我希望在您將組織附加到Foobar的位置上設置值。第二,正如Paul Keeble在評論中指出的那樣,該值似乎與組織有關,因此屬於該類別。

您將需要創建一個將Foobars與組織關聯的方法(與簡單設置成員變量相反)。這種方法將不得不設置計數器。 所以在Foobar的:

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

和組織:

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

您還需要過程的 「getNumberOfAssociationsForThisOrganization()」 和 「removeAssociation(本)」 的方法。

+0

你們誤解了當然,櫃檯的目的是因爲我把它命名得很糟糕。該計數器不應該告訴「組織中有多少Foobar」,它應該是組織中Foobar的序號,「這是組織X中的第3 Foobar」,因此它屬於Foobar而不是組織 –

0

我明白了。儘管有意見,orderNr確實屬於Foobar而不是Organization

但是,我覺得這應該以不同的方式實施。我不認爲Hibernate直接支持你想要的。很容易,至少。

我會添加一個時間戳到Foobar,這將保存創建實例的時間。然後,您可以通過運行像

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

另外一個查詢找到實際的orderNr,我可能有OrganizationList<Foobar>(即用@OneToMany(mappedBy = "organization")映射它。當然,也許你並不需要它。