实体的Spring Data Repository,其中外键也是主键

时间:2013-11-22 16:06:22

标签: java spring jpa foreign-key-relationship spring-data-jpa

我在使用JPA2(EclipseLink)和Spring Data 1.4.2时遇到了一些问题。 在我的例子中,两个表具有一对一的关系:

表A:

  • aId(PK)
  • ...

表B:

  • bId(PK,FK - 映射到表A中的aId)
  • ...

所以我试着做这个实体:

EntityA:

@Entity
@Table(name = "TableA")
public class EntityA implements Serializable {
    @Id
    @GeneratedValue
    @Column(name = "aId")
    private Long id;
    // another fields and getter/setter/business methods
    ... 
}

EntityB:

@Entity
@Table(name = "TableB")
public class EntityB {
    @Id
    @OneToOne
    @JoinColumn(name = "bId", referencedColumnName = "aId")
    private EntityA id;
    // another fields and getter/setter/business methods
    ... 
}

EntityA的Spring Data Repository运行良好:

@Repository(value = "aRepository")
public interface RepositoryA extends CrudRepository<EntityA, Long> {
}

但对于EntityB:

@Repository(value = "bRepository")
public interface RepositoryB extends PagingAndSortingRepository<EntityB, EntityA> {
}

抛出异常:

Expected id attribute type [class java.lang.Long] on the existing id attribute [SingularAttributeImpl[EntityTypeImpl@5270829:EntityA [....] but found attribute type [class EntityB]. 

2 个答案:

答案 0 :(得分:4)

主要问题(例外)不是使用@JoinColumn而不是@PrimaryKeyJoinColumn,而是当前Spring数据的限制(截至1.7.1)。 我也遇到了这个问题并打开了DATAJPA-649。 我无法找到解决方法,而是更改数据模型,以便EntityB具有独立于EntityA的主键。使用@MapsId也无济于事。

答案 1 :(得分:3)

要使用的注释是@PrimaryKeyJoinColumn,而不是@JoinColumn

  

指定用作连接到另一个表的外键的主键列。

     

它用于将JOINED映射策略中实体子类的主表连接到其超类的主表;它在SecondaryTable注释中用于将辅助表连接到主表; ,它可以在OneToOne映射中使用,其中引用实体的主键用作引用实体的外键

(强调我的)