Java hibernate假外键_java – Hibernate:没有实体类的外键,只能通过id
我有一個(gè)分層實(shí)體,它將自己引用為父母.我只需要通過(guò)id進(jìn)行映射,而不是通過(guò)實(shí)體實(shí)例進(jìn)行映射(原因太復(fù)雜,無(wú)法解釋).所以我這樣定義了實(shí)體:
class Item {
@Id
private String id;
@ManyToOne(targetEntity = Item.class)
@JoinColumn(name = "PARENT_ID", nullable = true)
private String parentId;
}
這似乎工作正常.在數(shù)據(jù)庫(kù)中正確創(chuàng)建外鍵約束.但是當(dāng)我執(zhí)行以下查詢(xún)時(shí):
SELECT i FROM Item i WHERE i.parentId = :parentId
我得到了這個(gè)例外(有趣的部分是粗體):
org.hibernate.PropertyAccessException:調(diào)用com.example.dom.Item.id的getter時(shí)發(fā)生IllegalArgumentException
在org.hibernate.property.BasicPropertyAccessor $BasicGetter.get(BasicPropertyAccessor.java:192)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)
在org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746)
在org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465)
在org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243)
at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:293)
在org.hibernate.type.EntityType.getIdentifier(EntityType.java:537)
在org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174)
在org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
在org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:616)
在org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901)
在org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
在org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
在org.hibernate.loader.Loader.doQuery(Loader.java:910)
在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
在org.hibernate.loader.Loader.doList(Loader.java:2554)
在org.hibernate.loader.Loader.doList(Loader.java:2540)
在org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
在org.hibernate.loader.Loader.list(Loader.java:2365)
在org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
在org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
在org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
在org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)
在org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
在com.example.dao.ItemDao.findChildrenByParentId(ItemDao.java:43)
在com.example.dao.ItemDao $$FastClassBySpringCGLIB $$51b04ce9.invoke()
在org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
在org.springframework.aop.framework.CglibAopProxy $CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
……還有47個(gè)
引起:java.lang.IllegalArgumentException:object不是聲明類(lèi)的實(shí)例
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在java.lang.reflect.Method.invoke(Method.java:597)
在org.hibernate.property.BasicPropertyAccessor $BasicGetter.get(BasicPropertyAccessor.java:169)
……還有76個(gè)
似乎Hibernate正在嘗試使用屬性parentId,就好像它是Item類(lèi)型,而不是String類(lèi)型.
有任何想法嗎?
另外請(qǐng)不要建議我使用延遲加載.在我的情況下這是不可行的(再次,太難解釋).
總結(jié)
以上是生活随笔為你收集整理的Java hibernate假外键_java – Hibernate:没有实体类的外键,只能通过id的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java清除输出内容_java – 从
- 下一篇: java 有选择的查询_如何在Jav