2010-12-01 6 views
1

Ich arbeite mit einer Web-Anwendung auf Spring Roo 1.0.2 gebaut. Ich habe eine Entität definiert, die eine PERSONID-Spalte für den Primärschlüssel sowie mehrere andere Felder enthält.Spring Roo @Id Feld in DataOnDemand Test nicht gefüllt

@Id 
@Column(name = "PERSONID", precision = 10, scale = 0)  
private Long personId; 

@Size(max = 50) 
@Column(name = "NAME") 
@NotNull 
private String name; 

... 

Die von Roo verwalteten Integrationstests enthalten eine Funktion, die ein Mock-Objekt instanziiert und jedes Nicht-Id-Feld ausfüllt.

public Person PersonDataOnDemand.getNewTransientPerson(int index) { 
    Person obj = new Person();  
    obj.setName("name_" + index); 

    //set other non-Id fields 

    return obj; 
} 

Diese Funktion wird von Integrationstests genannt und nicht später als die Datenbanktabelle eine nicht null Einschränkung für die Spalte PERSONID hat. Ich habe versucht, die Annotation @NotNull explizit auf die personId-Spalte zu setzen, aber es hat keine Auswirkungen. Ich vermute, das hat etwas damit zu tun, dass PERSONID ein nicht automatisch generierter Primärschlüssel ist.

Ich weiß, dass ich dies angehen kann, indem ich die Integrationstests überschreibe und die Id selbst bevölkere, aber ich möchte das, wenn möglich, vermeiden. Kennt jemand einen Weg, wie ich dieses Feld automatisch in die verwalteten DataOnDemand-Objekte eintragen kann?

+0

Im "normalen" Fall Spring Roo erstellt seine eigenen ID-Felder in einem seiner Aspekte (ich glaube in xx_entity.aj) - Haben Sie das roo gemanagte ID-Feld deaktiviert? - Und würde es funktionieren, wenn Sie die Roo Managed ID verwenden? – Ralph

+0

@Ralph - danke, du warst richtig. Sobald ich die @Id-Annotation entfernt habe, erhielt der Aspekt _entity.aj ein neues verwaltetes @Id-Feld und getNewTransientPerson das Feld PersonId. Leider habe ich in meinem Fall keine Kontrolle über das DB-Schema, daher kann ich keinen verwalteten Primärschlüssel verwenden :(. Es sieht so aus, als müsste ich die Tests überschreiben und das PersonId-Feld manuell füllen. – DrewCo

+0

Sie könnten versuchen, dies zu tun RooEntity.identifierColumn - ich habe dieses Feld vorher noch nie benutzt - aber ich nehme an, dass Sie das brauchen – Ralph

Antwort

0

Spring Roo erstellt ein eigenes ID-Feld im _entity.aj-Aspekt. Daher wird kein zusätzliches Feld mit @ID in der "base" -Klasse benötigt. Das Roo verwaltete ID-Feld sollte von Roos DataOnDemand aufgefüllt werden.

Die Datenbankspalte für die roo verwaltete ID ist standardmäßig "id". Wenn Sie einen anderen Spaltennamen benötigen (z. B. um dem Datenbankschema zu entsprechen), könnte die Spalte durch @RooEntity.identifierColumn angegeben werden.