我使用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(而不是代码)查询所有翻译,我该怎么办?由于语言环境和代码现在是主键的一部分,我可以单独查询它们吗?
答案 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)