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

时间:2018-03-28 15:09:47

标签: java hibernate spring-data-jpa

在不同的包中有两个具有相同简单名称的实体,引用相同的表名但不同的方案(物理上不同的表)。代码编译没有错误。如果未触发这些表的行为,则执行正确。但是当调用存储库包含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文档中都没有找到任何相关信息。 如果还有其他有用的信息,请发表评论。

1 个答案:

答案 0 :(得分:1)

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

  • 完全限定的类名:你可以使用这个名称,因为它包含了包名。

  • 表名:你可以再次使用,因为模式使它们区别开来。

  • 实体名称:那个用于JPQL查询,并且(我猜)在内部用于保存元数据。默认情况下,这与简单类名相同。但您可以使用@Entity注释将其更改为(几乎)您喜欢的任何内容。