我在使用JPA2(EclipseLink)和Spring Data 1.4.2时遇到了一些问题。 在我的例子中,两个表具有一对一的关系:
表A:
表B:
所以我试着做这个实体:
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].
答案 0 :(得分:4)
主要问题(例外)不是使用@JoinColumn
而不是@PrimaryKeyJoinColumn
,而是当前Spring数据的限制(截至1.7.1)。
我也遇到了这个问题并打开了DATAJPA-649。
我无法找到解决方法,而是更改数据模型,以便EntityB
具有独立于EntityA
的主键。使用@MapsId
也无济于事。
答案 1 :(得分:3)
要使用的注释是@PrimaryKeyJoinColumn
,而不是@JoinColumn
:
指定用作连接到另一个表的外键的主键列。
它用于将JOINED映射策略中实体子类的主表连接到其超类的主表;它在SecondaryTable注释中用于将辅助表连接到主表; ,它可以在OneToOne映射中使用,其中引用实体的主键用作引用实体的外键。
(强调我的)