Ошибка запроса JPA / Hibernate, связанная с именем переменной объекта - PullRequest
2 голосов
/ 10 марта 2012

Я новичок в JPA, и я провел последние 4 дня, пытаясь выяснить, почему * & ^! @ Мои запросы продолжают взрываться. После долгих церемоний кажется, что проблема как-то связана с именем переменной, которую я использую. Смотрите мои сущности и тестовый класс ниже. Приношу свои извинения за огромный пост, но я постарался максимально упростить его.

@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
@Column(length = 50)
private String name;
@ManyToOne
private MyEntity myEntity;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "myEnt", fetch = FetchType.EAGER)
@MapKey(name = "typeName")
private Map<String, ContainedEntity> ecConfigs;

public MyEntity() {
}

public MyEntity(String name, MyEntity myEntity) {
    this.name = name;
    this.myEntity = myEntity;
}

public MyEntity(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Map<String, ContainedEntity> getEcConfigs() {
    return ecConfigs;
}

public void setEcConfigs(Map<String, ContainedEntity> ecConfigs) {
    this.ecConfigs = ecConfigs;
}

public MyEntity getMyEntity() {
    return myEntity;
}

public void setMyEntity(MyEntity myEntity) {
    this.myEntity = myEntity;
}

public String toString() {
    return name + " -- " + myEntity;
}
}
@IdClass(ContainedEntityPK.class)
@Entity
public class ContainedEntity {

@Id
private String typeName;
@Id
private MyEntity myEnt;
@Column(length = 255)
private String ceName;

public ContainedEntity() {
}

public ContainedEntity(String typeName, String ceName) {
    super();
    this.typeName = typeName;
    this.ceName = ceName;
}

public String getTypeName() {
    return typeName;
}

public void setTypeName(String typeName) {
    this.typeName = typeName;
}

public MyEntity getMyEnt() {
    return myEnt;
}

public void setMyEnt(MyEntity myEnt) {
    this.myEnt = myEnt;
}

public String getCeName() {
    return ceName;
}

public void setCeName(String ceName) {
    this.ceName = ceName;
}

}
public class ContainedEntityPK implements Serializable{
private static final long serialVersionUID = -1714218588564578557L;
@Column(length = 255)
private String typeName;
@ManyToOne
private MyEntity myEnt;

public ContainedEntityPK() {
}

public ContainedEntityPK(String typeName, MyEntity myEnt) {
    super();
    this.typeName = typeName;
    this.myEnt = myEnt;
}

public String getTypeName() {
    return typeName;
}

public void setTypeName(String name) {
    this.typeName = name;
}

public MyEntity getMyEnt() {
    return myEnt;
}

public void setMyEnt(MyEntity myEnt) {
    this.myEnt = myEnt;
}

public int hashCode() {
    return (int) (typeName.hashCode() + myEnt.hashCode());
}

public boolean equals(Object obj) {
    if (obj == null)
        return false;
    if (obj == this)
        return true;
    if (!(obj instanceof ContainedEntityPK))
        return false;
    ContainedEntityPK pk = (ContainedEntityPK) obj;
    return pk.getMyEnt().equals(myEnt) && pk.typeName.equals(typeName);
}
}
public class Tester {
static EntityManagerFactory emf = Persistence.createEntityManagerFactory("testPersistenceUnit");

/**
 * @param args
 */
public static void main(String[] args) {
    addEntities();
    findEntity("aEntity");
    findEntity("bEntity");
}

public static void addEntities() {
    EntityManager em = emf.createEntityManager();

    MyEntity aEntity = new MyEntity("aEntity");
    MyEntity bEntity = new MyEntity("bEntity", aEntity);

    em.getTransaction().begin();
    em.persist(aEntity);
    em.persist(bEntity);
    em.getTransaction().commit();
    em.close();
}

public static void findEntity(String name) {
    EntityManager em = emf.createEntityManager();

    TypedQuery<MyEntity> q = em.createQuery("SELECT M FROM MyEntity M WHERE M.name=:name", MyEntity.class);
    q.setParameter("name", name);
    System.out.println(q.getSingleResult());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="testPersistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>test.nocommit.MyEntity</class>
<class>test.nocommit.ContainedEntity</class>
<properties>
  <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
  <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@server:1521:instance"/>
  <property name="javax.persistence.jdbc.user" value="user"/>
  <property name="javax.persistence.jdbc.password" value="pass"/>
  <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
  <property name="hibernate.hbm2ddl.auto" value="create"/> 
</properties>
</persistence-unit>
</persistence>

Когда я запускаю предыдущий основной класс, он ведет себя, как я ожидаю, и получаю следующий вывод:
aEntity - null
bEntity - aEntity - null

Однако, если я изменю имя переменной MyEntity.ecConfigs на MyEntity.secConfigs и поменяю получатели / установщики на:

    public Map<String, ContainedEntity> getSecConfigs() {
        return secConfigs;
    }

    public void setSecConfigs(Map<String, ContainedEntity> secConfigs) {
        this.secConfigs = secConfigs;
    }

Это взрывается на findEntity ("bEntity"); вызов. Мой вывод:
aEntity - null
с последующим исключением:

Exception in thread "main" org.hibernate.AssertionFailure: null identifier
    at org.hibernate.engine.spi.EntityKey.<init>(EntityKey.java:69)
    at org.hibernate.internal.AbstractSessionImpl.generateEntityKey(AbstractSessionImpl.java:240)
    at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:722)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:635)
    at org.hibernate.loader.Loader.doQuery(Loader.java:856)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2058)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:82)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:72)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3697)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:439)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:420)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:204)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:251)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:148)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:954)
    at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:903)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:610)
    at org.hibernate.type.EntityType.resolve(EntityType.java:438)
    at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:150)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1006)
    at org.hibernate.loader.Loader.doQuery(Loader.java:883)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
    at org.hibernate.loader.Loader.doList(Loader.java:2463)
    at org.hibernate.loader.Loader.doList(Loader.java:2449)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
    at org.hibernate.loader.Loader.list(Loader.java:2274)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1115)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:280)
    at test.nocommit.Tester.findEntity(Tester.java:38)
    at test.nocommit.Tester.main(Tester.java:17)

Сначала я обвинил это в Spring, но я полностью удалил Spring и все еще сталкиваюсь с проблемой.

Моя спящая версия называет себя 4.0.1. Финал

Я что-то здесь упускаю? Есть ли какие-то требования к именам переменных? Я наступаю на некоторые зарезервированные слова? Я не правильно указываю что-то? Из того, что я могу сказать, может быть какое-то отношение к самоссылающейся сущности, а также к составному первичному ключу ... В настоящее время я сбит с толку и тихо плачу в своей кабинке.

Ответы [ 2 ]

1 голос
/ 10 марта 2012

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

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

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

0 голосов
/ 20 сентября 2017

Ну, это не простое решение, сегодня я столкнулся с той же проблемой с двумя Pojos (A и B), оба имеют поле java.utl.Long как @Id.У A pojo есть поле, которое является коллекцией для другой сущности.

Мой процесс загрузки похож на этот: A -> B -> Bc

Процесс загрузки был сбой из-за c, загрузкаc выбрасывал пропущенный параметр IN / OUT, но это было скрыто за сообщенным исключением.

В моем случае я смог решить проблему, потому что отсоединение c от B с использованием режима выборки SELECT вместо SUBSELECT».Но я потерял 8 часов в поисках информации.Моя спящая версия 3.6.10-Final

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