hibernate SessionFactory и CriteriBuilder

131
12 ноября 2019, 14:40

Здраствуйте! Есть сущность

@Entity
@Table(name = "ItemsStore")
public class StoredItem implements Serializable {
public StoredItem(){}
public StoredItem(HistoryBuy item){
    this.name=item.getName();
    this.appID= Integer.parseInt(item.getApp_id());
    this.author= PrivateCodes.getInstance().getAPI();
    this.price= Double.parseDouble(item.getPrice());
    this.itemID = item.getItem_id();
}
private static final long serialVersionUID = -1798070786993154676L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "itemID")
private String itemID;
@Column(name="appID")
private int appID;
@Column(name = "author")
private String author;

@Column(name = "price")
private double price;
//getter and setters...
}

Получаю сущности из таблицы следующим образом.

public List<StoredItem> getIDSByName(String name) {
        CriteriaBuilder cm = session.getCriteriaBuilder();
        CriteriaQuery<StoredItem> storedItemCriteriaQuery = cm.createQuery(StoredItem.class);
        Root<StoredItem> storedItemRoot = storedItemCriteriaQuery.from(StoredItem.class);
        storedItemCriteriaQuery.select(storedItemRoot);
        storedItemCriteriaQuery.where(cm.and(cm.equal(storedItemRoot.get("author"),this.author),cm.equal(storedItemRoot.get("name"),name)));
        return session.createQuery(storedItemCriteriaQuery).getResultList();
    }

Изменяю значения результата и использую в дальнейшем.

List<StoredItem> ids = service.getIDSByName(name);
ids.forEach(x->x.setPrice(x.getPrice()/(1.0-5.0/100)));

После повторного выполнения CriteriaBuilder приходят уже измененные данные. В таблице данные не меняются. Как правильно работать с результатом чтобы получать данные из таблицы, а не измененные в памяти?

Answer 1

При очистке сессии работает корректно.

public List<StoredItem> getIDSByName(String name) {
    session.clear();
    CriteriaBuilder cm = session.getCriteriaBuilder();
    CriteriaQuery<StoredItem> storedItemCriteriaQuery = cm.createQuery(StoredItem.class);
    Root<StoredItem> storedItemRoot = storedItemCriteriaQuery.from(StoredItem.class);
    storedItemCriteriaQuery.select(storedItemRoot);
    storedItemCriteriaQuery.where(cm.and(cm.equal(storedItemRoot.get("author"),this.author),cm.equal(storedItemRoot.get("name"),name)));
    return session.createQuery(storedItemCriteriaQuery).getResultList();
}
READ ALSO
resize в scene builder javafx

resize в scene builder javafx

ЗдраствуйтеУ меня такая проблема

125
Retrofit и SharedPreferences: Как сохранить полученный токен?

Retrofit и SharedPreferences: Как сохранить полученный токен?

Не получается сохранить токенВ файле preferences

150
Error: Program type already present:

Error: Program type already present:

Выскакивает ошибка при сборке проекта Error: Program type already present: comlaba2

107
Как сделать таймер для GUI в Java?

Как сделать таймер для GUI в Java?

Есть код, последовательность операций

113