JPA @GeneratedValue на id - PullRequest
       23

JPA @GeneratedValue на id

1 голос
/ 11 января 2010

В JPA я использую @GeneratedValue:

@TableGenerator(name = "idGenerator", table = "generator", pkColumnName = "Indecator" , valueColumnName = "value", pkColumnValue = "man")
@Entity
@Table(name="Man")
public class Man implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "idGenerator")
    @Column(name="ID")
    private long id;

    public void setId(Long i) {
        this.id=i;
    }

    public Long getId(){
        return id;
    }
}

Первоначально я установил для идентификатора какое-то произвольное значение (позже оно использовалось как условие проверки):

public class Sear {
    public static void main(String[] args) throws Exception {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("testID");
        EntityManager em = emf.createEntityManager();
        Man man = new Man();
        man.setId(-1L);
        try {
            em.getTransaction().begin();
            em.persist(man);
            em.getTransaction().commit();
        } catch (Exception e) { }
            if(man.getId() == -1);  
        }
    }
}

Какое ожидаемое значение man.id после выполнения commit ()? Должно ли это быть (-1), вновь сгенерированное значение или я должен ожидать исключения?

Я хочу использовать эту проверку для обнаружения любых исключений при сохранении.

Ответы [ 3 ]

4 голосов
/ 16 июня 2010

Каково ожидаемое значение man.id после выполнения commit ()? Должно ли это быть (-1), вновь сгенерированное значение, или я должен ожидать исключения?

Вы просто не должны установить id при использовании GeneratedValue. Поведение при сохранении будет отличаться от одной реализации к другой, и поэтому полагаться на это поведение - плохая идея (непереносимая).

Я хочу использовать эту проверку для обнаружения любых исключений при сохранении.

JPA выдаст (подкласс) PersistenceException, если возникнет проблема. Правильный способ решения проблемы - перехватить это исключение (кстати, это RuntimeExeption).

Если вы настаиваете на проверке бедного человека, не присваивайте id и проверяйте, сохраняется ли у вас значение по умолчанию после сохранения (в вашем случае это будет 0L).

1 голос
/ 12 января 2010

Установка значения поля, которое генерируется автоматически, не имеет значения. Он будет (должен быть) установлен реализацией JPA в соответствии с указанной стратегией.

0 голосов
/ 19 марта 2013

В EclipseLink это настраивается с использованием перечисления IdValidation и аннотации @PrimaryKey или свойства единицы сохранения состояния eclipselink.id-validation.

По умолчанию ноль и 0 приведут к регенерации идентификатора, но будут использоваться другие значения. Если для IdValidation установлено значение ОТРИЦАТЕЛЬНОЕ, отрицательные числа также будут заменены.

Вы также можете настроить объект Sequence так, чтобы он всегда заменял значение.

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