2014-03-06 29 views
0

使用NHibernate(或Hibernate作为映射没有区别),我想用下面的SQL创建一个对象:NHibernate的(休眠)自动递增的专属

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这样基本的事情,但是因为已经有了一个内置的工具。

任何想法?

再次提前致谢。

回答

1

我用符号这样来产生的Postgres ID:

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

只是告诫你的答案,如果你的序列不存在于数据库中,您需要使用SQL脚本创建它,或者将hibernate设置为创建 - 删除模式,以便Hibernate将为您创建序列。 – JamesENL

+0

通过Id注释使主键?我需要主键为EntityId,但是辅助键和auto_increment是我复制到许多行的 – Droydn

+0

。我认为它会产生序列而不使用ID – s7474

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

感谢您的回复。我确认Guids或Guids没有问题。我能够使用nHibernate生成那些罚款。但是,使用您在那里的映射,当nhibernate在数据库中生成模式时,我的表没有auto_increment值。所有对该表的插入在Number字段中都为null,因为我们要求不要插入此字段并且不更新它,但Number字段也未标记为auto_increment。我需要nHibernate来生成一个Guid(它会这样做),并用它在模式创建时用auto_increment标记Number。 – Droydn