IDENTITY_INSERT с JPA

2

Я пытаюсь вставить некоторые поддельные данные в базу данных SQL Server Express. Я использую простой код:

@Entity
@Table(name = "People")
public class Peeps implements Serializable {

    @Id
    @Column(name = "ID", columnDefinition = "Decimal(10,0)")
    private String id;

    @Column(name = "PERSON_NAME")
    private String name;

}

Я вызываю диспетчер сущностей для создания вышеуказанного класса следующим образом:

private EntityManager em = createManager();
private EntityTransaction utx = em.getTransaction();

final Peeps entity = new Peeps();
entity.setId("10002");
entity.setName("Joe");
utx.begin();
em.persist(entity);
utx.commit();

Однако при этом я получаю сообщение об ошибке ::

 Cannot insert explicit value for identity column in table 'People' when IDENTITY_INSERT is set to OFF

Поэтому я попытался сделать что-то вроде этого:

em.createNativeQuery("SET IDENTITY_INSERT People ON").executeUpdate();
em.persist(entity);
em.createNativeQuery("SET IDENTITY_INSERT People OFF").executeUpdate();

Тем не менее, я по-прежнему получаю ту же ошибку. Моя интуиция заставляет меня думать, что связь не разделяется. Есть ли что-то, что я могу сделать, чтобы проинструктировать спящий режим, чтобы установить IDENTITY_INSERT в ON, прежде чем я буду ссылаться на мое упорство?

  • 0
    Есть ли причина, по которой вам нужно явно установить идентификатор для сущности, или вы можете просто позволить базе данных обрабатывать это для вас?
  • 0
    @Naros Честно говоря, если посмотреть на мою логику, моя сущность никогда не будет записана в базу данных в производственном коде. Следовательно, стратегия по умолчанию, я полагаю, требует, чтобы идентификатор вводился базой данных вручную. Имея это в виду, я добавил это @GeneratedValue (Strategy = GenerationType.IDENTITY) к моей сущности, чтобы позволить таблице сгенерировать этот идентификатор и вернуть его сущности после того, как мы подтвердим это. Как вы думаете, это хорошая стратегия?
Показать ещё 1 комментарий
Теги:
hibernate
jpa

1 ответ

5
Лучший ответ

Вам не хватает следующей строки под полем id:

@GeneratedValue(strategy=GenerationType.IDENTITY)

Итак, ваше поле id должно выглядеть так:

@Entity
@Table(name = "People")
public class Peeps implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ID", columnDefinition = "Decimal(10,0)")
    private String id;

    @Column(name = "PERSON_NAME")
    private String name;

}

Во-вторых, вы не должны сами устанавливать идентификатор для своего объекта, ID будет сгенерирован автоматически, когда вы будете продолжать его использовать спящий режим.

поэтому избавьтесь от: entity.setId("10002");

и просто сделайте это:

private EntityManager em = createManager();
private EntityTransaction utx = em.getTransaction();

final Peeps entity = new Peeps();
entity.setName("Joe");
utx.begin();
em.persist(entity);
utx.commit();

что-то еще убедитесь, что вы настроили свой первичный ключ в своей таблице БД с автоматическим приращением.

  • 1
    использование сгенерированной аннотации значения будет опираться только на таблицу, к которой относится объект, для установки правильного идентификатора?
  • 0
    Я не уверен, что ты спрашиваешь
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню