Спящий объект создает исключение InvocationTargetException при сохранении - PullRequest
0 голосов
/ 03 апреля 2011

Я пытаюсь выяснить, почему я получаю InvocationTargetException при сохранении модифицированного объекта игрока. Этот проект представляет собой проект Spring Roo с Hibernate в качестве ORM (и GWT для внешнего интерфейса, но здесь это не имеет значения, поскольку ошибка происходит в бэкэнде).

При пошаговом выполнении кода возникает ошибка в player.persist (), который вызывается с помощью вызова RPC:

@Override
public LeagueDto setPlayerLeague(long playerId, String session, long leagueId) {

    Player player = Player.findPlayer(playerId);
    League league = League.findLeague(leagueId);

    player.setLeague(league);
    player.persist(); // fails here

    // do some more stuff here before returning the DTO

    return leagueDto;
}

Заход в player.persist () переходит к модели:

@RooJavaBean
@RooToString
@RooEntity(finders = { "findPlayersByUsername" })
public class Player {

    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "S-")
    private Date created;

    @NotNull
    @Column(unique = true)
    @Size(min = 3, max = 32)
    private String Username;

    ....

    @Size(max = 64)
    private String FirstName;

    @Size(max = 64)
    private String LastName;

    @ManyToOne
    private Country country;

    @ManyToOne
    private League league;

    ...

}

Далее в модель переходим к коду AspectJ, где вызывается persist:

privileged aspect Player_Roo_Entity {

    declare @type: Player: @Entity;

    @PersistenceContext
    transient EntityManager Player.entityManager;

    ....

    @Transactional
    public void Player.persist() {
        if (this.entityManager == null) this.entityManager = entityManager();
        this.entityManager.persist(this);
    }

    ....
}

Затем ему удается перешагнуть this.entityManager.persist (this), и когда функция завершается, в RPC происходит сбой.

public static String invokeAndEncodeResponse(Object target,
      Method serviceMethod, Object[] args,
      SerializationPolicy serializationPolicy, int flags)
      throws SerializationException {

       ....

    String responsePayload;
    try {
      Object result = serviceMethod.invoke(target, args);

      responsePayload = encodeResponseForSuccess(serviceMethod, result,
          serializationPolicy, flags);
    } catch (IllegalAccessException e) {
    ....
    } catch (IllegalArgumentException e) {
    ....
    } catch (InvocationTargetException e) {
        // Try to encode the caught exception
        //
        Throwable cause = e.getCause();

        responsePayload = encodeResponseForFailure(serviceMethod, cause,         serializationPolicy, flags);
}

Есть идеи, почему это не удается? Я не делаю ничего сложного, просто базовое обновление.

1 Ответ

0 голосов
/ 04 апреля 2011

Я наконец взломал его.

Поле версии в базе данных было пустым, после изменения его на 0 оно работало безупречно. Кажется, Hibernate пытается увеличить нулевое поле.

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

...