代码之家  ›  专栏  ›  技术社区  ›  uli

spring数据jpa存储库是否可以使用多个具有相同简单名称的实体?

  •  0
  • uli  · 技术社区  · 7 年前

    在不同的包中有两个具有相同简单名称的实体,引用相同的表名但不同的方案(物理上不同的表)。代码编译时没有错误。如果未触发这些表的行为,则正确执行。但是错误 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);
    }
    

    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文档中未找到任何相关信息。 如果有任何其他有用的信息,请留下评论。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Jens Schauder    7 年前

    实体类有三个相关的类似名称的值:

    • 完全限定类名:由于它包含包名,所以您在这方面做得很好。

    • 表名:您又没事了,因为模式使它们与众不同。

    • 实体名称:该名称用于JPQL查询和(我猜)映射内部保存元数据。默认情况下,这与简单类名相同。但您可以使用 @Entity (几乎)任何你喜欢的注释。