Composite Id JPA2和Spring Data无法正常工作

时间:2016-02-14 12:24:12

标签: java spring hibernate jpa spring-data

我使用JPA 2映射了以下实体:

@Entity
public class Translation {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

private String locale;

@Column(name = "business_code",insertable = true,updatable = false,length = 200,nullable = false)
private String code;

private String text;

// Gettets and setters
....
}

然后我意识到对(语言环境,代码)应该是唯一的,所以我已经将实体更改为具有由locale组成的embeddedId,代码和我从映射中删除了列id。这样,这对将作为主键,不能重复:

结果:

@Entity 
public class Translation {

@EmbeddedId
private TranslationId translationId;

private String text;

public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

public TranslationId getTranslationId() {
    return translationId;
}

public void setTranslationId(TranslationId translationId) {
    this.translationId = translationId;
}

@Override
public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
}
}

和embeddedId类:

@Embeddable
public class TranslationId implements Serializable{

private static final long serialVersionUID = 1L;

private String locale;

@Column(name = "business_code",insertable = true,updatable = false,length = 200,nullable = false)
private String code;

@Override
public boolean equals(Object obj){
    return EqualsBuilder.reflectionEquals(this, obj);
}

@Override
public int hashCode(){
    return HashCodeBuilder.reflectionHashCode(this);
}

public String getLocale() {
    return locale;
}

public void setLocale(String locale) {
    this.locale = locale;
}

public String getCode() {
    return code;
}

public void setCode(String code) {
    this.code = code;
}
}

我使用Spring数据来查询数据,所以我还修改了我的JPA存储库以考虑新的复合ID:

@Repository
public interface TranslationRepository extends   JpaRepository<Translation,TranslationId> {

}

所以,首先,有人在这里看错了吗?我应该用另一种方式吗?由于我的测试不再通过,如果我做一个简单的translationRepository.findAll(),我没有得到任何结果(但数据库中有数据),但我没有收到任何错误消息。 ..

第二 - 如果我让它工作,然后我希望Spring数据只通过locale(而不是代码)查询所有翻译,我该怎么办?由于语言环境和代码现在是主键的一部分,我可以单独查询它们吗?

1 个答案:

答案 0 :(得分:1)

由于您的第一个问题已经解决,我将回答第二个问题

  

我希望Spring数据仅通过语言环境(而不是代码)查询所有翻译,我该怎么做?

locale仍可通过translationId作为单个媒体资源访问。在JPQL中,您可以编写

SELECT t FROM Translation t WHERE t.translationId.locale = :locale

在Spring Data存储库中,您可以在自定义命名方法

上使用@Query
@Query("SELECT t FROM Translation t WHERE t.translationId.locale = :locale")
public List<Translation> findByLocale(@Param("locale") String locale)

或使用稍长的方法名称,但由Spring Data自动处理

public List<Translation> findByTranslationIdLocale(String locale)