Не удается получить точный идентификатор из составного ключа - PullRequest
0 голосов
/ 23 декабря 2018

Я не могу получить точный идентификатор из составного ключа.
Я использую 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 is первичный ключ , автоинкремент и уникально , но barcode является просто первичным ключом .
Эти оба поля являются составнымиключи .

Summery:
Когда я пропускаю инициализирующий идентификатор, он дает

java.lang.NullPointerException  

Так что, если он инициализируется, он может генерировать идентификатор автоматически при вставке, даже просто помещая '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);

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 голосов
/ 24 декабря 2018

Я все еще рекомендую удалить класс ProductId на основании уникальности значения id в нем.Но чтобы запрос работал с классом ProductId:

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

Измените критерии для класса Product вместо класса ProductId.

Я думаю (но я неуверен), что приведенные ниже изменения также необходимы, указывая Hibernate на поле int id поля ProductId id.

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

Я также рекомендую изменить имя одного из двух полей id, чтобы уменьшить кодзапутанный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...