Hibernate: риски, связанные с изменением DiscriminatorValue - PullRequest
2 голосов
/ 16 сентября 2010

Дано:

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="postType", discriminatorType=DiscriminatorType.STRING)
public class Post {}

@DiscriminatorValue(value = PostType.BUG)
public class BugReport extends Post {}

То есть ... Ошибки начинают жизнь в этой системе как Пост. Позже их можно повысить (?) До BugReport.

Я использую следующий подход для обновления:

@Transactional
public Post setPostType(Post post, String postType)
{
    SQLQuery sql = getSession().createSQLQuery("UPDATE post SET postType = :postType where id = :id");
    sql.setString("postType", postType);
    sql.setInteger("id", post.getId());
    sql.executeUpdate();

    getSession().evict(post);
    getSession().flush();

    Post newPost = get(post.getId());
    return newPost;
}

Хотя это работает, (тип записи изменяется, и возвращается из БД как BugReport). Мне любопытно, есть ли побочные эффекты или риски, связанные с этим подходом.

1 Ответ

1 голос
/ 16 сентября 2010

Хотя это работает, (тип записи изменяется и возвращается из БД в виде BugReport). Мне любопытно, есть ли какие-либо побочные эффекты или риски, связанные с этим подходом.

Одна проблема, которую я вижу, состоит в том, что вы пропускаете оптимистические проверки блокировок, и параллельная транзакция, обновляющая тот же Post, может, таким образом, отменить изменения. Поэтому вам, вероятно, следует включить проверку версии в ваше обновление и выдать исключение, если число, возвращаемое executeUpdate, не равно 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...