【问题标题】:NHibernate (Hibernate) Auto Increment On PropertyNHibernate (Hibernate) 属性自动递增
【发布时间】:2014-03-06 21:53:23
【问题描述】:

使用nHibernate(或者Hibernate作为映射没有区别),我想用下面的SQL创建一个对象:

CREATE TABLE `table` (
    `EntityId` binary(16) NOT NULL,
    `Number` int(11) NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`EntityId`),
    Key(`Number`)
);

我尝试使用生成的属性、附加的 id 标记、在属性标记下的列标记中指定 sqltype,并弄乱了默认值、插入、更新和非空属性,但似乎没有任何效果。我只是无法在 Hibernate 映射语法中映射它吗?如何获取不是自动递增的主键的属性?

我会发布我得到的映射,但它们都不起作用。

提前致谢

更新: 使用这个映射,我认为这是一个很好的起点,但不是我想要的:

<class name="TheEntity" table="table">

  <id name="Id" 
     column="EntityId"
     generator="guid.comb" />

  <property name="Number" 
            generated="insert"
            insert="false" update="false" />
</class>

数据库中的模式是这样生成的:

CREATE TABLE `table` (
  `EntityId` binary(16) NOT NULL,
  `Number` int(11) DEFAULT NULL,
  PRIMARY KEY (`EntityId`)
);

这不是期望的行为。 nHibernate 也不会通过某种方式将序列插入到 Number 中。生成的属性,如上所示,从我读过的内容来看,数据库完全通过触发器之类的东西来处理插入和更新。我不想使用触发器来做一些像 auto_increment 这样基本的事情,但是因为已经有一个内置的工具可以做到这一点。

有什么想法吗?

再次提前致谢。

【问题讨论】:

    标签: c# mysql sql hibernate nhibernate


    【解决方案1】:

    我使用这样的符号来为 postgres 生成 id:

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "financialAnalyst_seq_gen")
    @SequenceGenerator(name = "financialAnalyst_seq_gen", sequenceName = "financialAnalyst_id_seq", allocationSize=1)
    

    【讨论】:

    • 只是对您的答案的警告,如果您的序列在数据库中不存在,您需要使用 SQL 脚本创建它,或者将 hibernate 设置为 create-drop 模式,以便 Hibernate 将创建适合你的顺序。
    • Id 注释不会使主键成为主键吗?我需要主键为 EntityId 但辅助键和 auto_increment 为 Number
    • 我复制了很多行。我认为它会在不使用 id 的情况下生成序列
    【解决方案2】:

    不太确定问题出在哪里,但映射可能是这样的:

    <class name="TheEntity" table="table">
    
      <id name="Id" 
         column="EntityId"
         generator="guid.comb" />
    
      <property name="Number" 
                generated="insert"
                insert="false" update="false" />
    </class>
    

    号码:

    不代表id的生成值可以标记为5.5. Generated Properties。引用:

    generated="insert" - 声明给定的属性值是在插入时生成的,但不会在后续更新时重新生成。

    我们还帮助 NHibernate 明确声明不插入和更新。

    Guid - EntityId:

    我没有使用 MySQL,所以不确定 guid 映射是否还有一些问题 - 检查
    Using Guid as Id column in NHibernate causes format exception when using MySQL

    但总的来说,当 NHibernate 使用生成器为我们创建新的 EntityId 值时,可能是这样的。如果应用程序创建 EntityId 不同的值,只需使用generator="assigned"

    C# 中的实体类应如下所示:

    public class TheEntity 
    {
        public virtual Guid Id { get; set; }
        public virtual int Number { get; set; }
    

    【讨论】:

    • 感谢您的回复。我已确认 Guid 或生成 Guid 没有问题。我可以使用 nHibernate 来生成这些罚款。但是,使用您在那里的映射,当 nhibernate 在数据库中生成模式时,我的表没有 auto_increment 值。对表的所有插入在 Number 字段中都有空值,这是可以预期的,因为我们说不要插入此字段并且不要更新它,但 Number 字段也没有标记为 auto_increment。我需要 nHibernate 来生成一个 Guid(它确实如此)并在创建模式时使用 auto_increment 标记 Number。
    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多