TypeMisMatchException в спящем режиме - PullRequest
0 голосов
/ 12 сентября 2018

Ниже приведен мой класс Person:

package com.subir.sample;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;

@Entity
@Table(name ="person",uniqueConstraints = {@UniqueConstraint(columnNames= {"NAME"})})
public class Person implements Serializable{
/**
 * 
 */
private static final long serialVersionUID = -2728179031744032393L;
int age;
String name;
char isVip;

public Person() {
}
public Person(int age, String name, char isVip) {
    this.age = age;
    this.name = name;
    this.isVip = isVip;
}
@Id
@Column(name="AGE")
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
@Id
@Column(name="NAME")
//@OneToMany(mappedBy="NAME")
private Set <Subject> subjects;
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@Id
@Column(name="ISVIP")
public char getIsVip() {
    return isVip;
}
public void setIsVip(char isVip) {
    this.isVip = isVip;
}
}

И ниже приведен мой класс для добавления и просмотра лиц.

package com.subir.sample;

import org.hibernate.Transaction;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class PersonDbAccess {
public static void addPerson(String name, int age, char isVip, Session session, org.hibernate.Transaction tx) {
    try {
        tx = session.beginTransaction();
        Person p = new Person(age, name, isVip);
        session.save(p);
        tx.commit();

    } catch (Exception e) {
        tx.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }
}

public static void viewPerson(String name, Session session) {
    try {
        System.out.println("Name value in view method is :: " + name);
        Person person = (Person)session.get(Person.class, name);
        System.out.println("Person.class is ::" + Person.class + " Person.class.getName is :: "
                + Person.class.getName() + " Person.class.getSimpleName() is :: " + Person.class.getSimpleName()
                + " Person.class.getCanonicalName is :: " + Person.class.getCanonicalName());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        session.close();
    }
}

public static void main(String[] args) {
    SessionFactory factory = HibernateUtils.buildSessionFactory();
    Session session = factory.openSession();
    Transaction tx = null;
    String name = "Subir";
    int age = 20;
    char isVip = 'Y';
    // addPerson(name,age,isVip,session,tx);
    viewPerson("Subir", session);
}
}

Ниже приведена моя трассировка стека:

Exception in thread "main" org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.subir.sample.Person. Expected: class com.subir.sample.Person, got class java.lang.String
at org.hibernate.event.internal.DefaultLoadEventListener.checkIdClass(DefaultLoadEventListener.java:166)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:86)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1240)
at org.hibernate.internal.SessionImpl.access$1900(SessionImpl.java:204)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.doLoad(SessionImpl.java:2842)
at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2816)
at org.hibernate.internal.SessionImpl.get(SessionImpl.java:1076)
at com.subir.sample.PersonDbAccess.main(PersonDbAccess.java:53)

Несмотря на то, что я передаю object.class,String в методе get объекта session, он дает мне исключение несоответствия типов.

1 Ответ

0 голосов
/ 12 сентября 2018

Вам нужно передать идентификатор в ваш метод get сеанса hibernate.В вашем случае у вас есть составной ключ, выборка только по имени может привести к возвращению более одного объекта, что противоречит природе операции get, которая возвращает один объект по первичному ключу.

Вам необходимо использоватьa Критерий или запрос здесь.

В другой заметке, если вы хотите использовать метод Session.get, вместо того, чтобы отмечать несколько столбцов с идентификатором, который не соответствует JPA, вы должны создать EmbededId и использовать его в сеансе.получить метод.Тогда это не будет несовместимый тип.

Чтение https://vladmihalcea.com/the-best-way-to-map-a-composite-primary-key-with-jpa-and-hibernate/

ОБНОВЛЕНИЕ: Я вижу, что у вас есть уникальное ограничение на имя.Почему вам нужен AGE и isVip, чтобы быть частью вашего ключа, потому что, пометив их ID, вы эффективно делаете их частью своего ключа.

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