2016-07-01 9 views
0

Ich habe eine Entität, die eine MySQL-Spalte als auto_increment definiert hatZurücksetzen AUTO_INCREMENT vor jedem Arquillian Test

@Column(columnDefinition = "integer auto_increment") 
private int entityNumber; 

Ich habe auch einen Arquillian-Test, in dem ich die Erstellung und Löschung dieser Einheit testen. Die Testklasse wird mit kommentierten

@UsingDataSet("datasets/empty.xml") 

Im folgenden Code ich erklären, was passiert ist, und die Fehler, die ich

bekommen
@Test 
public void createEntityTest1() { 
    Entity entity1 = persistEntity(); 
    assertEquals(1, entity1.entityNumber); // works perfectly  
} 

@Test 
public void createEntityTest2() { 
    Entity entity2 = persistEntity(); 
    assertEquals(1, entity2.entityNumber); 
    // fails! Since I am in a new test I expect the new entityNumber to be 1 
    // but it is actually 2 because entity2 was previously created in 
    // createEntityTest1, although the entity itself doens't exist anymore 
    //in the DB 
} 

Das Problem ist, dass der auto_increment Index nicht nach jedem Test, wird zurückgesetzt, so dass es für alle meine Tests zunimmt und wenn ich es überprüfen möchte, sind die automatisch generierten Zahlen größer als erwartet.

Gibt es eine Möglichkeit, diesen Wert nach jedem Test zurückzusetzen?

BEARBEITEN

Das SQL-Schema meiner Tabelle. Es ist wirklich leicht gefallen

CREATE TABLE `entity` (
    `id` varchar(36) NOT NULL 
    `version` bigint(20) NOT NULL, 
    `entity_number` int(11) NOT NULL AUTO_INCREMENT 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UK_entity_number` (`entity_number`), 
    KEY `IX_entity_entity_number` (`entity_number`), 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
+0

Überprüfen Sie meine Antwort [hier] (http://StackOverflow.com/a/37684606) ... tldr: Sie können in Lücken keilen, oder Sie können es höher setzen. Ansonsten trunkiere und füge zurück zu 1 für die nächste erste. Beachten Sie, dass bei innodb- und kaskadierten Löschvorgängen die Datenbank selbst die Eltern-/Kind-FK-Abhängigkeiten bereinigen kann, wenn dies beim Lesen Ihrer Frage ein Problem ist. Bereinigen Sie die Bedeutung "nicht verwaiste" untergeordnete Zeilen. – Drew

+0

Es scheint eine Möglichkeit zu sein, dies zu tun, aber ich wollte nicht direkt mit mysql-Sätzen in Verbindung treten. Ich habe mich gefragt, ob es einen "arquillianischen Weg" gibt, um das zu tun ... – iberbeu

+0

Sie haben nicht einmal ein Schema hier, um zu wissen, was die Frage/Herausforderung ist. – Drew

Antwort

1
CREATE TABLE `entity` (
    `id` varchar(36) NOT NULL, 
    `version` bigint(20) NOT NULL, 
    `entity_number` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UK_entity_number` (`entity_number`), 
    KEY `IX_entity_entity_number` (`entity_number`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- truncate table entity; 

insert entity (id,version) values (8,111),(9,11111); 
select * from entity; 
+----+---------+---------------+ 
| id | version | entity_number | 
+----+---------+---------------+ 
| 8 |  111 |    1 | 
| 9 | 11111 |    2 | 
+----+---------+---------------+ 

Visuelle eines Alter:

ALTER TABLE `entity` AUTO_INCREMENT = 550; -- move it up high 
insert entity (id,version) values (700,222233333111); 

+-----+--------------+---------------+ 
| id | version  | entity_number | 
+-----+--------------+---------------+ 
| 700 | 222233333111 |   550 | 
| 8 |   111 |    1 | 
| 9 |  11111 |    2 | 
+-----+--------------+---------------+ 

zurücksetzen leeren:

truncate table entity; 
insert entity (id,version) values (88888,111),(999999,11111); 
+--------+---------+---------------+ 
| id  | version | entity_number | 
+--------+---------+---------------+ 
| 88888 |  111 |    1 | 
| 999999 | 11111 |    2 | 
+--------+---------+---------------+ 

so müssen Sie entscheiden, welche von diejenigen, die Sie ausführen möchten: ALTER TABLE oder TRUNCATE TABLE.

Aber wie ich in den anderen Answer von mir zeigte, können Sie ALTER verwenden, um bekannte Lücken zu füllen, wenn Sie die Spalte explizit für die auto_increment Säule passieren. Aber Sie können den AI-Wert nicht niedriger bewegen, die AI-Spalte nicht passieren und erwarten, dass eine Lücke gefüllt wird (in diesem Fall wird die max (id) den AI-Wert automatisch auf den höchsten Wert in der Tabelle auffüllen).

+0

Das funktioniert eigentlich gut. Um dies in Arquillian zu tun, müssen Sie etwas wie 'entityManager.createNativeQuery ("ALTER TABLE' entity' AUTO_INCREMENT = 1 ") ausführen. ExecuteUpdate();'. Jedenfalls würde ich gerne wissen, ob es einen "Arquillian-Weg" gibt, um dies zu tun, bevor ich eine gültige Antwort akzeptiere. – iberbeu

+0

Cool. Ich hoffe, du kannst eine bessere Antwort bekommen oder eine Selbstantwort geben und diese annehmen. Prost. – Drew

Verwandte Themen