0

多対 1 の関係を持つ親をデータベースに保存しようとすると、子は正しい父親の ID で更新されません。

私にとってはうまくいきませんでしたが、似たような質問をここで見つけました:

Hibernate の 1 対多の外部キーは NULL です

nhibernate の多対 1 の親は挿入時に常に null です

これは私の「父」マッピングで、その後にそのクラスが続きます:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="FrancosPoS" namespace="FrancosPoS.DBMapping" xmlns="urn:nhibernate-mapping-2.2">
  <class name="order" table="`order`" lazy="true" >
    <id name="idOrder">
      <generator class="identity" />
    </id>
    <property name="price">
      <column name="price" sql-type="decimal(8,4)" not-null="true" />
    </property>
    <property name="cash">
      <column name="cash" sql-type="tinyint(1)" not-null="false" />
    </property>
    <property name="credit">
      <column name="credit" sql-type="tinyint(1)" not-null="false" />
    </property>
    <property name="obs">
      <column name="obs" sql-type="varchar(350)" not-null="false" />
    </property>
    <bag name="orderPsi" table="ordPsi" cascade="all" inverse="true">
      <key column="idOrdPastaI"/>
      <one-to-many class="ordPsi"/>
    </bag>
  </class>
</hibernate-mapping>

クラス:

namespace FrancosPoS.DBMapping
{    
    public partial class order
    {
        public order() { }
        public virtual int idOrder { get; set; }
        public virtual string price { get; set; }
        public virtual System.Nullable<int> cash { get; set; }
        public virtual System.Nullable<int> credit { get; set; }
        public virtual string obs { get; set; }
        public virtual IList<ordPsi> orderPsi { get; set; }
    }
}

次に、同じ注文を参照する orderPsi をいくつでも持つことができます。

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="FrancosPoS" namespace="FrancosPoS.DBMapping" xmlns="urn:nhibernate-mapping-2.2">
  <class name="ordPsi" table="ord_psi" lazy="true" >
    <id name="idOrdPastaI">
      <generator class="identity" />
    </id>
    <many-to-one insert="false" update="false" lazy="false" name="order" class="order">
      <column name="idOrder" sql-type="int(11)" not-null="false" />
    </many-to-one>
    <property name="obs">
      <column name="obs" sql-type="varchar(50)" not-null="false" />
    </property>
    <property name="price">
      <column name="price" sql-type="decimal(8,4)" not-null="true" />
    </property>
  </class>
</hibernate-mapping>

クラス:

public partial class ordPsi
{
    public ordPsi() { }
    public virtual int idOrdPastaI { get; set; }
    public virtual order order { get; set; }
    public virtual string obs { get; set; }
    public virtual string price { get; set; }
}

最後に、それを保存するために:

order order = new order();
ordPsi orderPsi = new ordPsi();

order.price = "321";
order.cash = 1;
order.credit = 0;

orderPsi.order = order;
orderPsi.price = "20.00";
order.orderPsi = new List<ordPsi>();
order.orderPsi.Add(orderPsi); //add the child to the father
orderDB.setOrder(order);

データベースメソッドで:

public string setOrder(order order)
{
    try
    {
        databaseConnection conn = new databaseConnection();
        conn.OpenConnection();

        conn.Session.SaveOrUpdate(order);

        conn.Commit();
        conn.CloseConnection();

        return "Success";
    }
    catch (Exception err)
    {
        return "Error: " + err;
    }
}

null 制約がないため、すべてが正常にコンパイルされてデータベースに保存されますが、ordPsi テーブルは orderID で更新されません。

また、コミットする前に 2 つのオブジェクトを保存しようとしました。「orderPsi.order = order」を設定せずに inverse="false" のままにしますが、成功しません。

これが役立つ場合、私はほとんどこの 2 つのチュートリアルに従っています。

Hibernate-inverse-属性

逆数による一対多

4

1 に答える 1

1

OrdPsi マッピングで update="false" insert="false" を削除します。更新または挿入時に列に値を設定しないように NHibernate に明示的に指示します。

于 2012-09-22T07:39:56.833 に答える