HIbernate перезаписывает данные при сохранении / сохранении объекта - PullRequest
6 голосов
/ 27 октября 2010

Я новичок в Hibernate. Когда я сохраняю конкретную сущность, она перезаписывает данные из существующей.

Я использовал ID как автоматически сгенерированный как показано ниже:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id")
private int id;

Здесь я сохраняю сущность, как показано ниже:

class StudDAO() {

public static void main(String[] args){
     StudDAO obj = new StudDAO();
     Stud stud = new Stud();
     stud.setName("Test");
     stud.setCity("Mumbai");
     obj.createStud(stud);
}

public void createStud(Stud stud) {
  try {

    Session session = HibernateSessionFactory.getSessionFactory().openSession();
    Transaction transaction = session.beginTransaction();
    session.save(stud);
    transaction.commit();

    } catch (Exception e) {
      // TODO: handle exception
       e.printStackTrace();
       transaction.rollback();
    }
}

}

если я изменю значение сущности в следующий раз, тогда он должен сгенерировать следующий идентификатор, а не начинать с первого идентификатора формы.

любой результат времени будет таким же, как

mysql> select * from stud;

+----+--------+------+
| id | city   | name |
+----+--------+------+
|  1 | Mumbai | Test |
+----+--------+------+

1 строка в наборе (0,00 с)

что я хочу получить в результате, как показано ниже:

mysql> select * from stud;
+----+--------+------+
| id | city   | name |
+----+--------+------+
|  1 | Mumbai | Test |
|  2 | Mumbai | Test |
+----+--------+------+
2 rows in set (0.00 sec)

Пожалуйста, помогите мне для того же ..

Ответы [ 5 ]

16 голосов
/ 25 октября 2011

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

Оказалось, это была настройка вмоя фабрика сессий:

Найдите параметр hibernate.hbm2ddl.auto , скорее всего, он установлен на создать .Этот параметр действует, когда создается ваша фабрика сеансов. create делает то, что он удаляет существующую схему (по крайней мере, таблицы, которые он будет использовать) и создает новую, создавая видимость, будто она перезаписывает строки в вашей таблице.

Есть несколько различных значений, которые вы можете выбрать здесь.Я полагаю, что для разработки вам нужно установить update , поскольку он создаст для вас новые таблицы, если они еще не существуют (как, например, create), но если таблица уже существуетон обновит схему.

Для производства следует придерживаться проверить , поскольку это не изменит вашу схему, просто validate it:)

Для более подробной информации о различных значениях, отметьте этот отличный ответ

2 голосов
/ 27 октября 2010

Попробуйте использовать saveOrUpdate(..)

Обратите внимание, что сущности JPA (Hibernate) идентифицируются по их @Id. Если ваш объект имеет тот же идентификатор, что и в БД, произойдет обновление. В противном случае, по логике, вставка произойдет.

2 голосов
/ 27 октября 2010

Если вы хотите обновлять, а не добавлять новую строку в базу данных каждый раз, вам нужно извлечь желаемую сущность, внести любые желаемые обновления и затем снова сохранить сущность.

0 голосов
/ 15 июля 2018

Если вы используете генератор классов Авто, то записи будут автоматически добавлены в новый автоматически увеличенный идентификатор.И те же данные в предыдущей записи также будут записаны в следующий идентификатор.Поэтому, если вам нужно вставить новую строку, либо меняйте тест данных и Mumbai каждый раз, когда вы запускаете приложение (плохая практика), либо используйте класс Scanner для чтения данных с клавиатуры и их динамической передачи в установщик.Надеюсь, вы это поняли.

0 голосов
/ 22 декабря 2016

добавление строки в созданную таблицу базы данных может помочь

 `id` INT(11) NOT NULL AUTO_INCREMENT

AUTO_INCREMENT увеличивает количество идентификаторов по мере добавления строки в таблицу.

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