gpt4 book ai didi

java - hibernate 中的 saveOrUpdate() 问题

转载 作者:行者123 更新时间:2023-11-30 11:57:30 25 4
gpt4 key购买 nike

最近我开始使用hibernate。插入或更新我正在使用 saveOrUpdate() 函数。如果我更新一个条目,我工作正常。但是,随着新条目 hibernate 生成一个查询。但是表中没有任何更新。

我的场景是这样的,

我在两个表之间使用多对一和一对多关系[Expense, Category]对于更新或插入,我正在创建两个对象(Expense expense, Category category)客户端。在服务器端,我将 category 对象设置为 expense 对象。

public void upDateExpenseTable(Expens expense, Category category) {

expense.setCategory(category);
Session session = Main.getSession();
try{
System.out.println("Inside Update Try Block");
session = Main.getSession();
Transaction tr = session.beginTransaction();
session.saveOrUpdate(expense);
tr.commit();

}
finally{
session.close();
}
}

对象结构如下,catogery.catId, category.catName &expense.expnsId, expense.expnsName, expense.amount, expense.status, expense.userName.

但是 Expensecat_id 中还有一列。它是通过映射注释。但是我在 Expense 实体中没有任何属性(property)。插入新数据时,我没有提供任何 Id。

任何建议!!!

public class Expens implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int expnsId;
private int amount;
private String date;
private String status;
private String userName;

@ManyToOne
@JoinColumn(name = "cat_id")
private Category category;
//Setter Getter

}

类别类

public class Category{
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int catId;
private String catName;

@OneToMany(targetEntity=Expens.class, mappedBy = "category", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Expens> expenses;
}//Setters Getters ommited.

最佳答案

我不确定我是否理解所有内容,但我至少可以告诉您,您没有正确构建双向关联,您需要在以下情况下设置“链接的两侧”构建你的对象图:

...
expense.setCategory(category);
category.getExpenses().add(expense);
...
session.saveOrUpdate(category);

这通常在“链接管理”方法中完成,像这样(在 Category 中):

@Entity
public class Category {

@Id @GeneratedValue(strategy=GenerationType.AUTO)
private int catId;
private String catName;

@OneToMany(targetEntity=Expens.class, mappedBy = "category", cascade = CascadeType.ALL, fetch=FetchType.EAGER)
private List<Expens> expenses = new ArrayList<Expens>();

public void addToExpenses(Expense expense) {
expenses.add(expense);
expense.setCategory(this);
}

protected List getExpenses() { // protected to prevent direct access from outside the hierarchy
return expenses;
}

protected void setExpenses(List expenses) { // protected to prevent direct access
this.expenses = expenses;
}

//...
}

代码变为:

category.addToExpenses(expense);
session.saveOrUpdate(category);

有趣的是(或不是),我今天已经写了三篇关于这个的文章。

资源

关于java - hibernate 中的 saveOrUpdate() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3783216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com