Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复合Id JPA2和Spring数据不工作_Java_Spring_Hibernate_Jpa_Spring Data - Fatal编程技术网

Java 复合Id JPA2和Spring数据不工作

Java 复合Id JPA2和Spring数据不工作,java,spring,hibernate,jpa,spring-data,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,nu

我使用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,code)应该是唯一的,所以我将实体更改为具有由locale,code组成的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扩展了JpaRepository{
}
那么,首先,有人认为这里有什么问题吗?我应该用另一种方式吗?由于我的测试不再通过,如果我执行一个简单的
translationRepository.findAll()
,我不会得到任何结果(但是数据库中有数据),但我不会得到任何错误消息


第二,如果我实现了这一点,然后我希望Spring数据只按语言环境(而不是代码)查询所有翻译,那么我该怎么做呢?由于区域设置和代码现在是主键的一部分,我可以独立查询它们吗?

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

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

locale
仍然可以通过
translationId
作为单个属性访问。在JPQL中,您可以编写

SELECT t FROM Translation t WHERE t.translationId.locale = :locale
在Spring数据存储库中,您可以在自定义命名方法上使用

@Query("SELECT t FROM Translation t WHERE t.translationId.locale = :locale")
public List<Translation> findByLocale(@Param("locale") String locale)
@Query(“从Translation t中选择t,其中t.translationId.locale=:locale”)
公共列表findByLocale(@Param(“locale”)字符串locale)
或者使用稍长的方法名,但由Spring数据自动处理

public List<Translation> findByTranslationIdLocale(String locale)
公共列表findbytransationidLocale(字符串区域设置)

你有translationId(EmbeddedId)的getter和setter吗不,我没有,但是我添加了,但运气不好,问题一直存在。你如何在测试中填充数据。嗨,就是这样!我的测试数据是从另一个文件填充到内存数据库中的Hsql中的,我忘记了删除Id列,因此没有添加数据,也没有收到任何关于它的消息。请你在主线程中回答这个问题,接受你的答案并结束这个问题,好吗?非常感谢你!那么问题的第二部分呢?现在是否可以独立于代码,使用区域设置查询所有翻译?