Java Hibernate@实体与非列对象的Spring@自动连线冲突

Java Hibernate@实体与非列对象的Spring@自动连线冲突,java,spring,hibernate,autowired,Java,Spring,Hibernate,Autowired,我有一个包含项目描述的表。项目有一个价格历史记录,可以是非常广泛的。正是这最后一点让我避免使用一对多的Hibernate映射和延迟加载。想想股票交易所的价格历史,很多历史 所以我有一个运行良好的缓存,它与Spring连接,DAO被注入,缓存管理需要查询的内容和它已经知道的内容 因此,“自然”的事情是能够询问一个项目的价格历史。下面是一些代码,它是真实事物的精简版本: @Entity @Table(name="item") public class Item { @Id @Colu

我有一个包含项目描述的表。项目有一个价格历史记录,可以是非常广泛的。正是这最后一点让我避免使用一对多的Hibernate映射和延迟加载。想想股票交易所的价格历史,很多历史

所以我有一个运行良好的缓存,它与Spring连接,DAO被注入,缓存管理需要查询的内容和它已经知道的内容

因此,“自然”的事情是能够询问一个项目的价格历史。下面是一些代码,它是真实事物的精简版本:

@Entity @Table(name="item")
public class Item {
    @Id
    @Column(name="id")
    private long id;
    @Column(name="name")
    private String name;

    @Autowired
    private PriceCache priceCache;

    /* ...setters, getters for id, name ... */

    public NavigableMap<LocalDateTime,SecurityValue> getPrices(LocalDateTime begTime, LocalDateTime endTime) {
        return priceCache.get(id, begTime, endTime);
    }
}
同样,只要我对PriceCache只使用静态方法,基本代码和缓存就可以正常工作,在这里我“手动”将其创建为单例。将其转换为让Spring处理其他地方的创建和注入也可以很好地工作。只有当我混合使用Hibernate和Spring时,我才会遇到问题

我还没有尝试为hibernate配置使用外部XML文件,这可能会解决问题,也可能不会


有没有办法告诉Hibernate这不是一列?或者,我是否应该遵循一种不同的模式来执行这类操作,可能是项对象的某种代理?

您可以使用
@Transient
注释,以指示不应将其持久化到数据库中


一般来说,我认为如果这是一个实体,它不应该有任何不属于它的自动连线缓存,但这是另一回事

您可以使用
@Transient
注释来指示它不应该被持久化到DB中


一般来说,我认为如果这是一个实体,它不应该有任何不属于它的自动连线缓存,但关于下面答案中的讨论,这是另一回事。 Hibernate集合和实体都是代理对象。 也许您可以尝试实现一个定制的HibernateProxy来管理您的集合。
根据文档,这似乎是可能的(CustomProxies),但我从未做过检查:

关于下面答案中的讨论。 Hibernate集合和实体都是代理对象。 也许您可以尝试实现一个定制的HibernateProxy来管理您的集合。
根据文档,这似乎是可能的(CustomProxies),但我从未做过检查:

我想我理解你为什么这么想,这就是我询问不同模式的目的。从商业角度来看,询问商品的价格历史记录是非常有意义的。该历史记录属于该项目。但是从性能和用例的角度来看,让Hibernate直接处理这个问题是“不好的”,但是Hibernate会延迟加载价格历史记录for@RolandRoberts它可能被认为是“价格历史属于项目”,但项目是离散项目还是“项目的连续流动”包含以前的价格和其他状态?Nir Levy是正确的,一个实体除了JPA注释之外不应该包含太多其他内容。应该将该缓存注入服务类,而不是实体。@MarcinL,您没有读到我的消息:-|。有几十万行的价格历史记录,典型的请求只需要几百行。即使使用Oracle Exadata数据库,当我让Hibernate惰性加载请求时,每个请求也需要几分钟的时间。就我而言,它还不够懒。这就是为什么PriceCache允许按日期时间范围进行询问。@Kayaman,好吧,我买这个。在某种程度上,缓存是一个服务容器。我已经这样做了标记,这样DAO就可以正确注射了。有一个ItemCache服务可以返回项目。当我得到一件商品时,我想询问它的价格历史。这并不是说完整的价格历史不属于我们,只是对于大多数用例来说,这是一个性能瓶颈。我想我理解你为什么这么想,这就是我询问不同模式的目的。从商业角度来看,询问商品的价格历史记录是非常有意义的。该历史记录属于该项目。但是从性能和用例的角度来看,让Hibernate直接处理这个问题是“不好的”,但是Hibernate会延迟加载价格历史记录for@RolandRoberts它可能被认为是“价格历史属于项目”,但项目是离散项目还是“项目的连续流动”包含以前的价格和其他状态?Nir Levy是正确的,一个实体除了JPA注释之外不应该包含太多其他内容。应该将该缓存注入服务类,而不是实体。@MarcinL,您没有读到我的消息:-|。有几十万行的价格历史记录,典型的请求只需要几百行。即使使用Oracle Exadata数据库,当我让Hibernate惰性加载请求时,每个请求也需要几分钟的时间。就我而言,它还不够懒。这就是为什么PriceCache允许按日期时间范围进行询问。@Kayaman,好吧,我买这个。在某种程度上,缓存是一个服务容器。我已经这样做了标记,这样DAO就可以正确注射了。有一个ItemCache服务可以返回项目。当我得到一件商品时,我想询问它的价格历史。这并不是说完整的价格历史记录不存在,只是它是大多数用例的性能瓶颈。根据评论,我发布了一个后续问题,根据评论,我发布了一个后续问题,我最终选择了一条我认为更符合Spring使用方式的不同路线,看看我最终在哪里回答了自己的问题。我最终走了一条我认为更符合Spring使用方式的不同路线,看看我最终在哪里回答了自己的问题。
Exception in thread "main" org.springframework.beans.factory.BeanCreationException:
   Error creating bean with name 'dbEMF' defined in class path resource [applicationContext.xml]:
     Invocation of init method failed;
   nested exception is javax.persistence.PersistenceException:
     [PersistenceUnit: default] Unable to build Hibernate SessionFactory;
   nested exception is org.hibernate.MappingException:
     Could not determine type for: com.example.cache.PriceCache, at table: item, for columns: [org.hibernate.mapping.Column(priceCache)]