【问题标题】:Dynamic Table creation in Hibernate Template在 Hibernate 模板中创建动态表
【发布时间】:2010-07-10 03:57:49
【问题描述】:

我正在使用 HibernateTemplate + SpringFramework 导入股票报价数据

数据格式

AAPL,09-Jun-2010 09:00,251.47,251.47,251.39,251.39,640
AAPL,09-Jun-2010 09:01,251.4,251.4,251.05,251.26,6844
INTC,09-Jun-2010 09:00,251.47,251.47,251.39,251.39,640
INTC,09-Jun-2010 09:01,251.4,251.4,251.05,251.26,6844
MSFT,09-Jun-2010 09:00,251.47,251.47,251.39,251.39,640
MSFT,09-Jun-2010 09:01,251.4,251.4,251.05,251.26,6844

我有一个名为 Stock 的实体类

@Entity
public class Stock implements Serializable {
public Stock() {}

private Long id;
private BigDecimal open;
    .... close,high, low..etc
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getId() {
    ....

我对这个设置的问题是休眠会将所有内容放入一个名为“Stock”的表中。

我想将不同的股票分成不同的表,所以根据上面的数据,我最终会得到 3 个表(AAPL、MSFT、INTC)

有没有一种简单的方法可以在不借助 Hibernate/HibernateTemplate 中的手写 sql 语句的情况下做到这一点?有点动态创建表?

环境: - Mysql、Hibernate3.5.3、springframework3.0

【问题讨论】:

    标签: java mysql hibernate spring


    【解决方案1】:

    我想将不同的股票分成不同的表,所以根据上面的数据,我最终会得到 3 个表(AAPL、MSFT、INTC)

    然后要么引入继承层次结构(使用 JOINED 或 TABLE_PER_CLASS 策略)并保持适当的子类型,要么可能使用horizontal partitioning(但这需要一些测试,但我从未使用 MySQL 和 Hibernate 做过)。

    【讨论】:

      【解决方案2】:

      如果没有为每个类设置自定义类,我不知道有一种简单的方法可以适当地制作这些表。

      话虽如此,我还是鼓励您重新考虑您的设计,并考虑使用更好的 OO 概念。

      例如,假设您保留了 Stock 对象/表格,但随后有另一个对象,例如 DailyActivity 组件,其中包含日期、开盘价、最高价、最低价、收盘价等。

      然后您可以将您的股票指定为具有 DailyActivity 对象的集合。然后 Hibernate 可以将其作为 Stock 映射到 DailyActivity 的一对多关系。

      然后,如果您想评估 MSFT 是如何做到的,那么从 Stock 表中选择 MSFT 记录并在指定时间段内选择其 DailyActivity 对象将成为一个相对简单的查询。

      【讨论】:

      • 所以你建议用一张大桌子来保存 Stock 对象。那里的数据是来自纳斯达克的分钟数据,而且表格很大,这就是为什么我想要为每只股票单独的表格。人们将如何处理这些数据?
      • 数据是按分钟完成的这一事实在课堂上并不清楚,正如您所展示的那样。您确实拥有的属性是每日价值,而不是周期性的日内价值。您是在谈论每分钟更新一个值字段还是每分钟实际捕获股票价格?如果是这样,您能否阐明您的数据模型?
      • 我们基本上是尝试从csv文件中导入分钟数据,所以这不是实时操作。 csv 的每一行都有一个精确到分钟的日期时间组件(请看上面,即 09-Jun-2010 09:01 )。最后,我们主要是读数据库,很少写(读/写比率是10/1)
      • @portoalet 我认为您可能需要重新考虑使用 Hibernate 的愿望,因为从长远来看,这属于可扩展性的领域(如果您有很多股票想要保留这个数据),Hibernate 不太适合。看起来您的数据模型很简单,JDBC 实现与一些触发器和存储过程相结合,为进入核心股票表的每个新股票代码创建新数据表,这可能是一种更好的方法。
      • 是的,从长远来看,我也对 Hibernate 的可扩展性表示怀疑。
      【解决方案3】:

      我不确定这是推荐的。 reference docs 建议该属性称为hibernate.hbm2ddl.auto

      Hibernate: hbm2ddl.auto=update in production? 和 Hibernate hbm2ddl.auto possible values and what they do? 有一些先前的讨论,你也应该看看

      【讨论】:

        猜你喜欢
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 2014-12-09
        • 1970-01-01
        • 1970-01-01
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多