Поле Spring Roo @Id не заполнено в тесте DataOnDemand

Я работаю с веб-приложением, построенным на Spring Roo 1.0.2. Я определил объект, который имеет столбец PERSONID первичного ключа, а также несколько других полей.

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

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

...

Интеграционные тесты, управляемые Roo, содержат функцию, которая создает экземпляр фиктивного объекта и заполняет все поля без идентификатора.

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

    //set other non-Id fields

    return obj;
}

Эта функция вызывается из интеграционных тестов и впоследствии завершается ошибкой, поскольку таблица базы данных имеет ненулевое ограничение для столбца PERSONID. Я попытался явно установить аннотацию @NotNull в столбце personId, но это не дало никакого эффекта. Я подозреваю, что это как-то связано с тем фактом, что PERSONID не является автоматически сгенерированным первичным ключом.

Я знаю, что могу решить эту проблему, переопределив интеграционные тесты и заполнив идентификатор самостоятельно, но я хотел бы избежать этого, если это возможно. Кто-нибудь знает, как я могу автоматически заполнить это поле в управляемых объектах DataOnDemand?


person DrewCo    schedule 01.12.2010    source источник
comment
В обычном случае Spring Roo создает свои собственные поля идентификатора в одном из своих аспектов (я верю в xx_entity.aj). Вы деактивировали поле идентификатора, управляемого пользователем? -- И будет ли это работать, если вы используете управляемый идентификатор roo?   -  person Ralph    schedule 02.12.2010
comment
@ Ральф - спасибо, ты был прав. Как только я удалил аннотацию @Id, аспект _entity.aj получил новое управляемое поле @Id, а getNewTransientPerson заполнил поле PersonId. К сожалению, в моем случае у меня нет контроля над схемой БД, поэтому я не могу использовать управляемый первичный ключ :(. Похоже, мне нужно будет переопределить тесты и заполнить поле PersonId вручную.   -  person DrewCo    schedule 02.12.2010
comment
Вы можете попробовать сделать это способом Roo, используя @RooEntity.identifierColumn — я никогда раньше не использовал это поле — но я ожидаю, что это то, что вам нужно.   -  person Ralph    schedule 02.12.2010
comment
@Ralph — установка свойства идентификатора столбца добавила поле @Id в аспект Entity, который был сопоставлен с моим столбцом PERSONID, а аспект DataOnDemand правильно заполнил поле. Однако определение PERSONID в аспекте Entity содержит GenerationType.AUTO, что приводит к автоматически сгенерированному значению в БД, когда мне нужно, чтобы оно было предоставлено пользователем. Я нашел forum.springsource.org/showthread.php?p=297476#post297476, и кажется, что тогда генерация тестов предназначена для последовательных ПК. Спасибо за вашу помощь, если вы опубликуете ответ, я был бы рад принять.   -  person DrewCo    schedule 02.12.2010


Ответы (1)


Spring Roo создает собственное поле идентификатора в аспекте _entity.aj. Таким образом, в «базовом» классе не требуется никакого дополнительного поля, отмеченного @ID. Поле управляемого идентификатора Roo должно быть заполнено DataOnDemand Roo.

Столбец базы данных для управляемого идентификатора roo по умолчанию имеет значение «id». Если вам нужно другое имя столбца (например, чтобы оно соответствовало схеме базы данных), тогда столбец может быть указан с помощью @RooEntity.identifierColumn.

person Ralph    schedule 02.12.2010