Как он мог бы обновлять единственное поле таблицы mysql с hibernate используя sesion.update
?
В объекте profile я имею только распределенный id_profile
и фотография тип blob
.
Только нуждалось в том, чтобы обновить поле фотография больше не другие поля, которые у меня есть в таблице.
Код, что, который я использую:
public static boolean actualizarProfile(Profile profile) {
Session session = HibernateUtil.getSessionFactory().openSession();
try{
session.beginTransaction();
session.update(profile);
session.getTransaction().commit();
session.disconnect();
return true;
}catch (Exception e) {
System.out.println("Error en el metodo actualizarAccount - " + e.getMessage());
return false;
}finally {
session.disconnect();
}
}
Согласно коду, кажись, что объект Profile profile
не будь присоединен (attached) с сеансом Hibernate. Из-за этого, когда ты реализуешь один update
то, что сделает Hibernate:
Profile
с настоящей информацией о базе данных.profile
у которого возможно есть остальные поля в null
).Ты можешь проверять, если он действительно обновляет все колонны давая возможность Hibernate, который показывал бы queries, которые он выполняет посредством свойства hibernate.show_sql=true
и подтверждать эффект, который я комментирую тебе.
Чтобы решать эту тему, у тебя есть 3 доступных выбора:
Выполнять query, где ты обновил только поле, в котором ты нуждаешься:
String hql = "UPDATE Profile SET photo = :photo WHERE id = :id";
int result = session.createQuery(hql)
.setParameter("photo", profile.getPhoto())
.setParameter("id", profile.getId())
.executeUpdate();
Получать организацию с Hibernate с Вашей информацией, setear поле, в котором ты нуждаешься, и посылать обновлять это:
Profile profileDB = session.get(Profile.class, profile.getId());
profileDB.setPhoto(profile.getPhoto());
session.update(profileDB);
Несмотря на то, что - меньший код, что предыдущий, - возможно, что эта альтернатива стоит больше времени выполнения, так как он должен получать объект базы данных, что может включать загружать нагруженную фотографию ранее и / или другие объекты, которые присоединены с классом (боль во времени скрытости сервера из-за информации, которая не требуется), добавочной вновь будут становиться отвечающими современным требованиям старые элементы твоего класса
Конфигурировать твой класс для того, чтобы он работал как dynamic-update. Это "прогресс" в предыдущую работу, так как твой предыдущий одинокий объект обновит поля, которые действительно были изменены. Для этого, ты должен менять твой такой класс:
@Entity
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
public class Profile implements java.io.Serializable {
//fields and other things in your class
}
Код, чтобы обновлять данные, - идентичен данным формы 2.
PodrГ-схвати заставлять это asГ - в час сохранять:
session.merge(profile);
или asГ-:
session.saveOrUpdate(profile);
В Hibernate или EclipseLink, изменения будут применимыми к полям, которые окажутся измененными. Он спрашивает у тебя, что у него нет конкретного ответа, просто он:
// photo es un byte[]
profile.setPhoto(photo);
// persistes los datos
hibernate.merge(profile);
profile
- объект, что не est и # 225; atachado в sesi и # 243; n Hibernate, из-за чего, если он только обладает полями id
и photo
со стоимостью и dem и # 225; s находятся в null
по умолчанию Hibernate обновлять и # 225; все поля.
–
28.09.2016, 17:45
hibernate.show_sql
и видеть query. Это м и # 225; s, mkyong я написал и # 243; руководитель по этому поводу: mkyong.com/hibernate/hibernate-dynamic-update-attribute-example
–
28.09.2016, 18:10