класс Student
saveorupdate() Безразлично не обновляет коллекцию (список) один-ко-многим в спящий режим
public class Student {
private Long id;
private String name;
private String className;
private List<Phone> phones;
// getter setter
}
класс Phone
public class Phone {
private Long id;
private String number;
//getter setter
}
-> mappping файл Student.hbm.xml
<id name="id" type="long" column="id">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<property name="className" column="class_name" type="string" />
<list name="phones" cascade="all-delete-orphan">
<key column="student_id"/>
<list-index column="idx" />
<one-to-many class="Phone" />
</list>
-> Файл отображения Phone.hbm.xml
<id name="id" type="long" column="id">
<generator class="native" />
</id>
<property name="number" column="number" type="string" />
, когда я пытаюсь обновить телефонный номер (список), предыдущая запись не удаляется, но IDX (индекс списка) и внешний ключ является нулевым, а новые записи отмечены правильным idx и внешним ключом! Другие данные (а не список) обновляются полностью точно. Здесь я получаю объект класса из базы данных, изменяю его и передаю объект saveorupdate()
, но не помог. Пробовал это так долго. Было бы большой помощью.
код для чтения и обновления:
private void readAndUpdateStudent() {
Student student = null;
Session session = HibernateUtil.getSessionFactory().openSession();
String name = "John";
try {
String queryString = "from Student student where student.name =:name";
Query query = session.createQuery(queryString);
query.setString("name", name);
student = (Student) query.uniqueResult();
System.out.println(student.getName());
student.setName("Mary");
List<Phone> phones = new ArrayList<Phone>();
phones.add(new Phone("555555")); //here if I SET rather adding, the already existing values, update is done accordingly
phones.add(new Phone("789789"));//but when I use the list as a string type(instead of Phone Type), adding a new 0bject deletes the previous
student.setPhones(phones);//entries and adds new list on its own but not in the case of user defined type.
} catch (Exception e) {
e.printStackTrace();
if (session != null) {
session.close();
}
}finally{
session.close();
updateStudent(student);
}
}
private void updateStudent(Student student) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.saveOrUpdate(student);
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
Вы пытаетесь обновить один телефонный номер (например, изменяя число через сеттер) или вы пытаетесь изменить список телефонных номеров студента? Я подозреваю, что вы меняете список. –
Я использую setter для установки в нем нового списка, например 'student.setPhones (phones)', где телефоны - это новый список –
@anonymous Покажите свой код для обновления телефона. – RAS