簡體   English   中英

Hibernate:沒有實體類的外鍵,只能通過id

[英]Hibernate: foreign key without entity class, only by id

我有一個分層實體,它將自己引用為父母。 我只需要通過id進行映射,而不是通過實體實例進行映射(原因太復雜,無法解釋)。 所以我這樣定義了實體:

class Item {

    @Id
    private String id;

    @ManyToOne(targetEntity = Item.class)
    @JoinColumn(name = "PARENT_ID", nullable = true)
    private String parentId;

}

這似乎工作正常。 在數據庫中正確創建外鍵約束。 但是當我執行以下查詢時:

SELECT i FROM Item i WHERE i.parentId = :parentId

我得到了這個例外(有趣的部分是粗體):

org.hibernate.PropertyAccessException:在org.hibernate.tuple.entity.AbstractEntityTuplizer的org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(BasicPropertyAccessor.java:192)中調用com.example.dom.Item.id的getter時出現IllegalArgumentException 。 org.hibernate上org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465)的org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746)中的getIdentifier(AbstractEntityTuplizer.java:346) .engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243)位於org.hibernate.type.Entity上的org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:293)(EntityType.java:537) )在org.hibernate.loader.hql.QueryLerader.bindParameterValues(org.hibernate.loader.hql.QueryLoader.bindParameterValues)的org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174)org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67) oader.java:616)位於org.hibernate.loader.Loader.executeQueryStatement的org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901)org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862) (Loader.java:1839)位於org.hibernate.loader.loQuery(Loader.java:910)org.hibernate.loader.doQuery.doQueryAndInitializeNonLazyCollections(Loader.java:355)org.hibernate.loader.Loader上的org.hibernate.loader.Loader.doQuery(Loader.java:910)。在org.hibernate.loader.loList(Loader.java:2540)的org.hibernate.loader.Loader.Linader.adList(Loader.java:2370)的org.hibernate.loader.Loader上的doList(Loader.java:2554) .list(Loader.java:2365)org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)at atg.hibernate.loader.hql.QueryLoader.list或者org.hibernate.internal.QueryImpl.list上的org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)中的org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)(QueryImpl。 java:103)在com.example.dao.ItemDao。 findChildrenByParentId(ItemDao.java:43)位於org.springframework的com.example.dao.ItemDao $$ FastClassBySpringCGLIB $$ 51b04ce9.invoke()at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)。 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更多引起:java.lang.IllegalArgumentException:object不是在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java)的sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 聲明類的實例 :39)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(B) asicPropertyAccessor.java:169)......還有76個

似乎Hibernate正在嘗試使用屬性parentId,就好像它是Item類型,而不是String類型。

有任何想法嗎?

另外請不要建議我使用延遲加載。 在我的情況下這是不可行的(再次,太難解釋)。

關聯使用實體引用(在這種情況下需要您使用真實對象Item )如果您想使用普通ID列,那么您說您不希望hibernate管理它們,只需刪除關聯注釋即可。

嘗試定義id列,例如試試這個。

@Column(name="id")

據我了解你的問題,這可能有用。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private String id;


@ManyToOne
@JoinColumn(name = "parent_id",nullable = true)
private Item item;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM