2015-10-05 3 views
0

Я пытаюсь сделать следующееСпринг колонка JPA DefaultValue

@ManyToOne 
@JoinColumn(name="tier_id", columnDefinition = "INT default 1", nullable = false) 
public Tier getTier() { 
    return tier; 
} 

, но при вставке записи я получаю com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'tier_id' cannot be null

Я хочу по умолчанию tier_id быть 1, если он не установлен, но это не так за работой. Как я могу правильно настроить это?

ответ

1

Значение по умолчанию SQL используется, только если столбец вообще отсутствует в инструкции insert.

Но Hibernate не пропускает столбцы в операторах вставки. Если вы создаете экземпляр сущности с нулевым уровнем и сохраняете его, вы эффективно говорите Hibernate, что хотите сохранить объект с нулевым уровнем, а Hibernate явно устанавливает для столбца tier_id значение null, поскольку это то, что вы сказали ему делать.

Итак, если вы хотите уровень вашего лица, чтобы быть уровня с идентификатором 1, то сделать это явно в коде приложения:

SomeEntity e = new SomeEntity(); 
e.setTier(em.getReference(Tier.class, 1)); 
em.persist(e); 
+0

Поэтому в основном я должен принести ярус, я хочу из базы данных с помощью TierDao например, затем установите его в объект, правильно? Я думал, что есть способ сделать это, не запрашивая уровень, так как все новые записи начинаются с уровня, который имеет идентификатор 1. Возможно, я думаю об этом неправильно. Большое спасибо за объяснение. – prettyvoid

+0

Вот что делает em.getReference(): он возвращает неинициализированный прокси, не запрашивая базу данных. –

+0

Любая идея, как я могу достичь того же, используя контекст постоянства пружин? У меня просто есть daos как интерфейсы, которые реализуют CrudRepository. Должен ли я каким-то образом получить ссылку на EntityManager? Любой совет будет оценен, спасибо за ценную информацию, все еще изучая здесь :) – prettyvoid