2009-08-25 7 views
0

Ich habe die folgende KlasseErstellen einer Sequenz auf der Grundlage einiger Kriterien

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

    @ManyToOne 
    private Organization organization; 

    private Long orderNr; 
} 

Was ich zu tun habe versucht, eine Inkrementierung Bestellnummer für dieses Objekt zu erstellen. Das Problem besteht darin, dass die Bestellnummer für jede Organisation eindeutig sein sollte. Beispiel, nehmen wir an, wir haben zwei Organisationen (nennen wir sie org1 und org2). Zuerst erstellen wir eine Instanz von Foobar und legen die Organisation auf org1 fest. Nach dem Speichern sollte der Wert von orderNr zu "1" werden. Dann erstellen wir eine weitere Instanz von Foobar und setzen die Organisation erneut auf org1. Die orderNr sollte jetzt den Wert '2' erhalten (für diese spezifische Instanz von Foobar sollte die erste Foobar immer noch den Wert '1' haben). Dann erstellen wir eine weitere Instanz von Foobar, aber dieses Mal setzen wir die Organisation auf org2, jetzt sollte orderNr den Wert '1' erhalten, da dies das erste Objekt für org2 war.

Was ist der einfachste Weg, dies zu erreichen? Gibt es etwas in JPA oder Hibernate, das es mir erlaubt, so etwas leicht zu machen (mithilfe von Anmerkungen) oder muss ich die Zählerwerte manuell verfolgen?

==== Einige Änderungen vorgenommen, weil die Frage missverstanden wurde.

+3

Warum auf der Foobar Klasse Zähler deklariert wird? Alles, was mit einer Organisation, und einzigartig in einer Organisation über die Organisation Klasse sollte zu tun. gegen mich wie ein Eigentum von Foobar –

Antwort

0

Erstens, warum sagen Sie, dass der Zählerwert auf "beim Speichern" eingestellt werden sollte? Das wird hart. Ich würde erwarten, dass stattdessen der Wert an dem Punkt festgelegt werden soll, an dem Sie eine Organisation an eine Foobar anhängen.

Zweitens, wie Paul Keeble in einem Kommentar bemerkte, ja, dieser Wert scheint organisationsbezogen zu sein und gehört somit in diese Klasse.

Sie müssen eine Methode erstellen, um Foobars mit Organisationen zu verknüpfen (anstatt einfach eine Membervariable zu setzen). Diese Methode muss den Zähler setzen. So in Foobar:

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

und in Organisation:

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

Sie brauchen auch "getNumberOfAssociationsForThisOrganization()" und "removeAssociation (this)" Methoden, natürlich.

+0

Ihr seid falsch verstanden klingt nicht das Zweck des Zählers natürlich, weil ich es schlecht genannt habe.Der Counter soll nicht sagen "wie viele Foobars es in der Organisation gibt", es soll vielmehr die Ordernummer der Foobar in einer Organisation sein, "Dies ist die 3. Foobar in Organisation X", daher gehört sie zu Foobar und nicht zur Organisation –

0

Ich habe es. Trotz der Kommentare gehört orderNr tatsächlich zu Foobar anstatt zu Organization.

Ich denke jedoch, dass dies auf eine andere Weise umgesetzt werden sollte. Ich glaube nicht, dass Hibernate direkt unterstützt, was Sie wollen. Leicht, zumindest.

Ich würde Foobar einen Zeitstempel hinzufügen, der die Zeit enthalten würde, als die Instanz erstellt wurde. Dann Sie die tatsächliche orderNr, indem Sie eine Abfrage wie

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

Zusätzlich finden könnte, würde ich wahrscheinlich Organization haben eine List<Foobar> (dh indem sie sie mit @OneToMany(mappedBy = "organization") abbildet. Natürlich vielleicht brauchen Sie es nicht .

Verwandte Themen