【问题标题】:Hibernate JPA @Inheritance TABLE_PER_CLASS JpaRepository on Child entity union select all tablesHibernate JPA @Inheritance TABLE_PER_CLASS JpaRepository on Child entity union 选择所有表
【发布时间】:2014-08-11 03:54:22
【问题描述】:

我有一个问题,我有一个带有继承 TABLE_PER_CLASS 和三个子表 StationCompany StationAnalysis StationVariant 的基本抽象实体站

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS )
public abstract class Station {

@Entity
public class StationCompany extends Station {

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
private Company company;

@Entity
public class StationAnalysis extends StationCompany {

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
private Analysis analysis;

@Entity
public class StationVariant extends StationAnalysis {

@ManyToOne(optional = false, fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
private Variant variant;

public interface IStationCompanyRepository extends JpaRepository<StationCompany, Long> {

@Service
public class StationService implements IStationService<StationCompany> {

    @Autowired
    IStationCompanyRepository stationCompanyRepository;

然后我在 StationCompany 上搜索 findAll,hibernate 使用 union select 进行查询。 我将只搜索 StationCompany 条目。

select x from ( select a from StationCompany union select b from StationVariant union select c from StationAnalysis )

【问题讨论】:

  • 但是StationAnalysis 是一个StationCompany,这不能怪hibernate,可以吗?
  • 我需要这个。 StationAnalysis 有一个 @ManyToOne 到 Company + Analysis 和 StationVariant to Company + Analysis + Variant 实体
  • 请详细说明你想要什么
  • 我有三个服务( StationCompanyService / StationAnalysisService / StationVariantService )我想在表格上搜索/创建/保存。但目前只有创建+保存是可以的,搜索是在所有三个表上,而不仅仅是一个。从 StationCompany JpaRepository 中选择一个会加载所有 Table 数据,但我只需要一个 Table 数据。

标签: java hibernate jpa table-per-class


【解决方案1】:

问题在于休眠映射。我认为从 Station 到 StationCompany 到 Station 的结构存在问题...... 我用额外的 Abstract @MappedSuperclass 类解决了这个问题。 之后休眠选择正确的表,不再选择联合。

@MappedSuperclass
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Station {

@MappedSuperclass
public abstract class AbstractStationCompany extends Station {
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    private Company company;

@Entity
public class StationCompany extends AbstractStationCompany {

@MappedSuperclass
public class AbstractStationAnalysis extends AbstractStationCompany {
    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    private Analysis analysis;

@Entity
public class StationAnalysis extends AbstractStationAnalysis {

@Entity
public class StationVariant extends AbstractStationAnalysis {

【讨论】:

    【解决方案2】:

    不要全部搜索。

    在 Station 上创建 NamedQuery:

    @NamedQuery(name="Station.findStationByType", 
                query="SELECT s FROM Station s WHERE TYPE(s) = :type")
    

    然后在您的站层次结构的主要外观中:

    public class StationFacade<Station>{
      @PersistenceContext("contextName")
      private EntityManager em;
    
      public List<Station> findAll(Class<? extends Station> stationType){
        return em.createNamedQuery("Station.findStationByType")
                 .setParameter("type", stationType.getSimpleName())
                 .getResultList();
      }
    }
    

    【讨论】:

    • sry 您的解决方案有错误,@NamedQuery 不知道类型。在使用 @NamedQuery(name = "StationCompany.findAll", query = "SELECT s FROM StationCompany s") 执行命名查询后,我找到了解决方案,此查询也进行了联合选择。在下一篇文章中是答案(我无法发布答案)
    • 问题是休眠映射。我认为从 Station 到 StationCompany 到 Station 的结构存在问题......我用额外的 Abstract @MappedSuperclass 类解决了这个问题。 (at)MappedSuperclass (at)Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 公共抽象类 Station { (at)MappedSuperclass 公共抽象类 AbstractStationCompany 扩展 Station { (at)ManyToOne(optional = false, fetch = FetchType.EAGER) (at)Fetch (FetchMode.SELECT) 私人公司公司;
    • (at)Entity public class StationCompany extends AbstractStationCompany { (at)MappedSuperclass public class AbstractStationAnalysis extends AbstractStationCompany { (at)ManyToOne(optional = false, fetch = FetchType.EAGER) (at)Fetch(FetchMode. SELECT) 私有分析分析; (at)Entity 公共类 StationAnalysis 扩展 AbstractStationAnalysis { (at)Entity 公共类 StationVariant 扩展 AbstractStationAnalysis {
    猜你喜欢
    • 2015-06-28
    • 2018-05-31
    • 2011-05-14
    • 2017-10-30
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2011-11-22
    相关资源
    最近更新 更多