java - 无法从复合键中检索准确的 ID
问题描述
我无法从复合键中检索确切的 ID。
我正在使用 MySQL 和 Hibernate。
Session session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(ProductId.class);
criteria.setProjection(Projections.max("id"));
criteria.setMaxResults(1);
Integer max = (Integer) criteria.uniqueResult();
if (max == null) {
max = 0;
//This always giving null.
所以它确实max =0;
在插入之前或之后,数据库中没有问题。
但通过使用检索id
:
productId.getId();
也总是给出零,但在数据库中它是递增的id
。
为什么会这样?
它不能导致它具有价值:
ProductId productId = new ProductId(id, barcode);
product.setName(name);
product.setPrice(price);
product.setId(productId);
id
是主键,自动增量和唯一,但barcode
只是主键。
这两个字段都是复合键。
Summery:
当我跳过启动 id 时,它会给出
java.lang.NullPointerException
所以如果它被初始化它可以在插入时自动生成id,即使只是输入'0'
ProductId productId = new ProductId(0, barcode);
完成插入。
但我无法准确检索id
。
我正在使用以下方法保存产品:
String name = jNameTextField.getText();
double price = Double.parseDouble(jPriceTextField.getText());
int barcode = Integer.parseInt(jBarcdTextField.getText());
ProductId productId = new ProductId(0, barcode); // put zero for check
product.setName(name);
product.setPrice(price);
product.setId(productId);
manager.addProduct(product);
产品.java
public class Product implements java.io.Serializable {
public ProductId id;
private String name;
private double price;
private Stock stock;
public Product() {
}
public Product(ProductId id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public Product(ProductId id, String name, double price, Stock stock) {
this.id = id;
this.name = name;
this.price = price;
this.stock = stock;
}
// Getter and Setters
谢谢你。
解决方案
我仍然建议删除 ProductId 类,因为它的 id 值是唯一的。但是,要使查询与 ProductId 类一起工作:
Criteria criteria = session.createCriteria(Product.class);
将条件更改为 Product 类而不是 ProductId 类。
我认为(但我不确定)下面的更改也是必要的,将 Hibernate 指向 ProductId id 字段的 int id 字段。
criteria.setProjection(Projections.max("id.id"));
我还建议更改两个 id 字段之一的名称,以使代码不那么混乱。
推荐阅读
- java - 使用 Retrofit Android 获取带参数的请求
- ios - 如何在 PhoneNumberTextField 的文本和占位符中添加插图
- javascript - 当我切换线时,将箭头的颜色更改为与 D3 中的线相同
- html - IE11 - 如果上方内容的高度大于窗口的高度,则页面底部的“页脚”会被向下推
- java - Android 应用程序:如何控制系统设置?
- r - 尝试检索存储桶元数据时使用 aws.s3::get_bucket_df() 返回错误?
- java - 未找到 JSON 对象
- ios - 混合表视图控制器中的自定义单元格(如何连接插座?)
- sql-server - sql 服务代理过期或被关闭
- html - 如何在 CSS 中链接到外部样式表