在不同的包中有两个具有相同简单名称的实体,引用相同的表名但不同的方案(物理上不同的表)。代码编译没有错误。如果未触发这些表的行为,则执行正确。但是当调用存储库包含home数据时,会出现错误org.hibernate.QueryException: could not resolve property description
。
问题:
第一个实体:package home,表在默认模式下(在实体管理器中指定):
package com.example.domain.home;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;
@Entity
public class Data implements Serializable {
private static final long serialVersionUID = 1L;
@Id
public String id;
public String description;
}
第二个实体:包工作,相同的简单名称,相同的表名,但不同的模式:
package com.example.domain.work;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
@Entity
@Table(name = "DATA", schema = "WORK")
public class Data implements Serializable {
private static final long serialVersionUID = 1L;
@Id
public String id;
}
从家中查找数据的存储库:
package com.example.domain.home;
import org.springframework.data.jpa.repository.JpaRepository;
public interface DataRepository extends JpaRepository<Data, Long> {
Data findTopByDescription(String description);
}
从工作中查找数据的存储库,需要指定名称,否则spring不想正确自动装配:
package com.example.domain.work;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository("workDataRepository")
public interface DataRepository extends JpaRepository<Data, Long> {
}
使用其中一个存储库:
package com.example.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.domain.home.DataRepository;
@Service
public class HomeService {
@Autowired
private DataRepository dataRepository;
public void test(){
dataRepository.findTopByDescription("Test");
}
}
在spring数据和hibernate文档中都没有找到任何相关信息。 如果还有其他有用的信息,请发表评论。
答案 0 :(得分:1)
实体类有三个相关的类似名称的值:
完全限定的类名:你可以使用这个名称,因为它包含了包名。
表名:你可以再次使用,因为模式使它们区别开来。
实体名称:那个用于JPQL查询,并且(我猜)在内部用于保存元数据。默认情况下,这与简单类名相同。但您可以使用@Entity
注释将其更改为(几乎)您喜欢的任何内容。