![](/img/trans.png)
[英]JPA 2 - How to build entity that has Primary key that is also a foreign key using Spring Data JPA?
[英]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.