2016-07-01 6 views
0

У меня есть объект, который имеет MySQL-столбец определен как auto_incrementСброс AUTO_INCREMENT перед каждым испытанием Arquillian

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

У меня также есть Arquillian тест, в котором я проверить создание и удаление этого объекта. Класс тест помечается с помощью

@UsingDataSet("datasets/empty.xml") 

В коде ниже я объясню, что происходит, и ошибка я получаю

@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 
} 

Проблема заключается в том, что после каждого теста, индекс auto_increment не сбрасывается, так что он продолжает увеличиваться для всех моих тестов, и когда я хочу его проверить, автоматически сгенерированные числа больше, чем ожидалось.

Есть ли способ сбросить это значение после каждого теста?

EDIT

SQL-схема моего стола. Это действительно легко один

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

Проверьте мой ответ [здесь] (http://stackoverflow.com/a/37684606) ... tldr: вы можете вклиниться в промежутки, или вы можете установить его выше. В противном случае, усечь и вернуться к 1 для следующего первого. Обратите внимание, что при удалении innodb и cascade вы можете самостоятельно деинсталлировать дочерние FK-зависимости родителя/ребенка, если это ваша проблема при чтении вашего вопроса. Очистить значения «не сиротские» дочерние строки. – Drew

+0

Кажется, это способ сделать это, но я не хотел напрямую связываться с предложениями mysql. Мне было интересно, есть ли у вас «аркиллийский способ» ... – iberbeu

+0

у вас даже нет схемы, чтобы узнать, что представляет собой вопрос/вызов. – Drew

ответ

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 | 
+----+---------+---------------+ 

Визуальная альтер:

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 | 
+-----+--------------+---------------+ 

Сброс опорожнить:

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

так что вы должны решить, какой из те, которые вы хотите выполнить: ALTER TABLE или TRUNCATE TABLE.

Но, как я показал в другом Answer, вы можете использовать ALTER для заполнения известных пробелов, если вы явно передаете столбец для столбца auto_increment. Но вы не можете сдвинуть значение ИИ ниже, не пропустить столбец ИИ и ожидать, что пробел будет заполнен (в этом случае max (id) будет автоматически заполнять значение AI, чтобы оно было самым высоким в таблице).

+0

Это действительно хорошо работает. Для этого в Arquillian вам нужно будет сделать что-то вроде 'entityManager.createNativeQuery (" ALTER TABLE 'entity' AUTO_INCREMENT = 1"). ExecuteUpdate(); '. Во всяком случае, я хотел бы знать, есть ли у него «аркиллианский способ», прежде чем принимать это действительный ответ. – iberbeu

+0

Прохладный. Надеюсь, вы сможете получить лучший ответ или сделать сам ответ и принять его. Приветствия. – Drew

Смежные вопросы