【问题标题】:Hibernate, SQL Server: How could I use default value as value from another columnHibernate,SQL Server:我如何使用默认值作为另一列的值
【发布时间】:2011-02-14 20:37:23
【问题描述】:

例如:我有 int identity(1,1) 类型的 COLUMN_PK 列和 int 类型的 COLUMN_NUM 列,如何定义 COLUMN_NUM 的默认值 - COLUMN_PK 的值?

因此,如果我有未指定 COLUMN_NUM 的实体,它将使用来自 COLUMN_PK 的生成值填充。但如果指定了 COLUMN_NUM,则将使用其值。

【问题讨论】:

    标签: sql sql-server hibernate hibernate-annotations


    【解决方案1】:

    创建计算的第三列

    CREATE TABLE MyTable (
       COLUMN_PK int NOT NULL identity(1,1) ,
       ...
       COLUMN_NUM_internal int NULL,
       COLUMN_NUM AS COALESCE (COLUMN_NUM_internal, COLUMN_PK),
       ...
    )
    

    直到 INSERT(当然)才知道 PK 值。但不是以前,所以你必须做这样的事情或使用触发器来更新 COLUMN_NUM。然而,上面的这个解决方案也适用于后续的更新,没有额外的代码(即更新的另一个触发器)

    【讨论】:

    • 这会增加休眠层的复杂性。仅尝试更新 column_num 也很复杂,这非常困难。一个好的解决方案有一个可供您阅读并更新的列。
    • @cyberkiwi :您的 ORM 很复杂,或者您有触发器。这是一个权衡。减少定制 SQL 代码不是 ORM 的一点吗?
    【解决方案2】:

    使用计算列和标量函数作为默认值。

    【讨论】:

    • 标量函数在插入之前不会有 PK 的值,因此 udf 不会帮助填充 COLUMN_NUM
    【解决方案3】:

    我会通过触发器强制执行此操作。

    create trigger tr_IU_YourTable on YourTable
    for insert,update
    as
    begin
        update yt
            set column_num = yt.column_pk
            from inserted i
                inner join YourTable yt
                    on i.column_pk = yt.column_pk
                        and yt.column_num is null
    end
    go
    

    【讨论】:

      【解决方案4】:

      让一个子表只存储 COLUMN_PK 和 COLUMN_NUM 怎么样?仅当指定了 COLUMN_NUM 值时,此表才会有记录。然后你可以这样做:

      CREATE TABLE Parent (COLUMN_PK int NOT NULL identity(1,1), someCol int NOT NULL)
      CREATE TABLE Child  (COLUMN_PK int NOT NULL, COLUMN_NUM int NOT NULL)
      
      INSERT INTO Parent (someCol) VALUES (1)
      INSERT INTO Parent (someCol) VALUES (2)
      INSERT INTO Parent (someCol) VALUES (3)
      INSERT INTO Parent (someCol) VALUES (4)
      INSERT INTO Parent (someCol) VALUES (5)
      INSERT INTO Child VALUES (1, 10)
      INSERT INTO Child VALUES (3, 30)
      INSERT INTO Child VALUES (5, 50)
      
      SELECT COLUMN_PK,
             CASE WHEN EXISTS (SELECT NULL FROM Child WHERE Child.COLUMN_PK = Parent.COLUMN_PK)
                  THEN (SELECT COLUMN_NUM FROM Child WHERE Child.COLUMN_PK = Parent.COLUMN_PK)
                  ELSE COLUMN_PK
             END
      FROM Parent
      

      【讨论】:

        【解决方案5】:

        使用 NHibernate 调用存储过程来插入数据,而不是通过 .save 方法使用直接插入,可以为您提供更多控制。

        【讨论】:

          猜你喜欢
          • 2014-08-18
          • 2015-08-04
          • 1970-01-01
          • 2019-09-09
          • 1970-01-01
          • 2016-08-03
          • 2016-03-22
          • 1970-01-01
          • 2014-10-24
          相关资源
          最近更新 更多