无法从组合键检索确切的ID

时间:2018-12-23 15:19:56

标签: java mysql hibernate

我无法从组合键中检索确切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只是 主键
这两个字段都是 复合键

摘要:
当我跳过启动ID时,它会给出

java.lang.NullPointerException  

因此,如果将其初始化,则即使在插入“ 0”时也可以自动生成id

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);

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 

谢谢。

1 个答案:

答案 0 :(得分:0)

我仍然建议根据其唯一的id值删除ProductId类。 但是,要使查询与ProductId类一起工作:

Criteria criteria = session.createCriteria(Product.class);

将条件更改为Product类而不是ProductId类。

我认为(但不确定),也需要进行以下更改,将Hibernate指向ProductId id字段的int id字段。

criteria.setProjection(Projections.max("id.id"));

我还建议更改两个id字段之一的名称,以减少代码的混乱。