代码之家  ›  专栏  ›  技术社区  ›  joshua.ewer

使用nHibernate2.0的会话时出现问题。在具有复合id的类上获取<T>

  •  5
  • joshua.ewer  · 技术社区  · 17 年前

    Person-具有PersonId、姓名
    Job-具有JobId、JobName
    PersonJob-有PersonId、JobId、工作年限

    注意:在我的对象模型中,我有代表每个表的实体。我有第三个实体来表示Person/Job关系,因为那里有有用的元数据(YearsOfEmployment),而不仅仅是一个简单的联接表。

    那么,如果我知道PersonId和JobId,是否有一种简单的方法让我使用会话并返回与这些Id匹配的对象?

    或者,换一种方式,因为我已经知道主键是脑死亡的,所以我可以用一种简单的方法将SQL“SELECT YearsOfEmployment FROM PersonJob WHERE PersonId=1 AND JobId=1”转换为类似的内容:

    var keys = new {PersonId=1, JobId=2};
    PersonJob obj = Session.Get<PersonJob>(keys);

    <class name="Person" table="dbo.Person" lazy="true">
      <id name="PersonId">
        <generator class="native"/>
      </id>
      <property name="Name"/>
    </class>
    <class name="Job" table="dbo.Job" lazy="true">
      <id name="JobId">
        <generator class="native"/>
      </id>
      <property name="JobName"/>
    </class>
    <class name="PersonJob" table="dbo.PersonJob" lazy="true">
      <composite-id>
        <key-property name="PersonId"></key-property>
        <key-property name="JobId"></key-property>
      </composite-id>
      <property name="YearsOfEmployment"/>
    </class>
    
    2 回复  |  直到 17 年前
        1
  •  8
  •   joshua.ewer    17 年前

    好吧,我回答了我自己的问题。我认为发布你的问题几乎和和和别人说出来一样具有宣泄作用。如果我将PersonJob的复合id设置为组件或类,即。

    <class name="PersonJob" table="dbo.PersonJob" lazy="true">
        <composite-id name="PersonJobKey" class="PersonJobKey">
          <key-property name="PersonId"></key-property>
          <key-property name="JobId"></key-property>
        </composite-id>
    </class>
    

    然后我可以简单地这样做:

    PersonJobKey key = new PersonJobKey() { PersonId = 1, JobId = 1 };  
    PersonJob obj = Session.Get<PersonJob>(key);  
    int yearsOfEmployment = obj.YearsOfEmployment;
    

        2
  •  3
  •   Mark Dickinson    17 年前

    感谢您在上面发布答案,我是在一个我映射的对象上查看它的,其中复合键没有名称或类。当我尝试创建一个类来表示复合键时,它改变了其他代码使用该对象时的行为方式。我也想写一些类似的东西;

    Session.Get<SalesRepArea>(new { AreaCode = "ACode", RegionCode = "RCode"});
    

    <class name="SalesRepArea">
       <composite-id>
          <key-property 
             name="AreaCode" column="AreaCode" type="String" length="12" />
          <key-property 
             name="RegionCode" column="RegionCode" type="String" length="12" />
       </composite-id>
    

    我写的代码少了一点,并省去了表示密钥的对象来获取

    SalesRepArea myArea = Session.Get<SalesRepArea>(
       new SalesRepArea()
       { 
          AreaCode = "ACode", 
          RegionCode = "RCode" 
       }
    );
    

    我并不是说命名键方法不好,代码越少并不总是越好,这只是为了表明Hibernate正在寻找键所在的对象,以便从数据库中获取特定对象。

    如果我错了,请告诉我,但我希望这能有所帮助,因为我在这方面遇到了一些麻烦。

    做记号