NHibernate(Hibernate)自动递增属性

时间:2014-03-06 21:53:24

标签: c# mysql sql hibernate nhibernate

使用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,并且使用默认值,插入,更新和非null属性,但似乎没有任何效果。我只是无法在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这样的基本操作,但是因为已经有内置功能。<​​/ p>

有什么想法吗?

提前再次感谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

<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; }