簡體   English   中英

為具有主鍵的實體定義彈簧數據JPA存儲庫接口,該主鍵也是JPA 2.x中的外鍵

[英]Defining a spring-data JPA repository interface for entity with primary key that is also a foreign key in JPA 2.x

我有一個具有JPA 2.x定義的主鍵的實體,該主鍵也是另一個實體的外鍵(JPA 2.x 允許 @*ToOne關系字段上的@Id注釋):

@Entity
class FooOptionalInfo {
    /* ... fields ... */

    @Id
    @OneToOne
    public Foo getFoo() { return foo; }

    /* ... setters ... */
}

@Entity
class Foo {
    @Id
    public Long fooId;

    /* ... getters/setters ... */
}

Spring JPA存儲庫接口應擴展Repository<T, ID>接口,其中T@Entity類, ID是實體的@Id字段,但是:

定義public interface FooOptionalInfoRepository extends Repository<Foo, Bar>extends Repository<FooOptionalInfo, Long>會在spring jpa初始化時導致以下相同錯誤:

Caused by: java.lang.IllegalArgumentException: This class [class com.example.FooOptionalInfo] does not define an IdClass
    at org.hibernate.jpa.internal.metamodel.AbstractIdentifiableType.getIdClassAttributes(AbstractIdentifiableType.java:183)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation$IdMetadata.<init>(JpaMetamodelEntityInformation.java:253)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:84)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:68)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:153)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:100)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:82)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:199)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:277)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:263)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:101)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    ... 20 common frames omitted

我是否需要恢復為JPA 1.x標准並定義Entity和基本id字段( @Id Long fooId; @OneToOne @PrimaryKeyJoinColumn(...) Foo foo;FooOptionalInfo )還是有吃的方法JPA 2.x簡化的注釋,以及我的spring倉庫蛋糕嗎?

id同時成為主鍵和外鍵是很奇怪的。 您可以通過另一種方式完成此操作:在Bar定義外鍵。

@Entity
class Foo {
    @Id
    private long id;
    // ...
}

@Entity
class Bar {
    @Id
    public Long barId;

    @OneToOne
    @JoinColumn(name="foo_id")
    private Foo foo;
}

暫無
暫無

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

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