0

休止状態のエラーをデバッグするのが非常に難しい理由を理解しようとしています。別の顧客のタリスのサブセットを持つ顧客オブジェクトを保存しようとすると、トリガー動作を絞り込みました。以下は、削除されたクラスと hbm マッピングです。

**<POJOs>**

public class Tarif {
  private Long idTarifRailingLTD;
  private String name;
  private Set<Customer> customers=new HashSet<Customer>();
}

public class Customer extends Society {
    private Company company;
    private boolean actif;
    private String tvaNumber;
    private Set<Tarif> tarifRailings = new HashSet<Tarif>();
}


**<HBMs>**    
  
<class name="comp.model.accounting.Tarif" table="Tarif" lazy="false">
    <id name="idTarif" type="long">
        <generator class="native"/>
    </id>
        
    <property name="name" length="50" not-null="true"/>
        
    <set name="customers"  table="customer_tarifrailing" inverse="true" lazy="false" fetch="select" cascade="all">
        <key column="idTarif"/>
        <many-to-many class="comp.model.customer.Customer" column="idCustomer"/>
    </set>
        
</class>

<joined-subclass name="comp.model.customer.Customer" table="customer" lazy="false">
    <key column="idSociety"/>
    <property name="actif" type="boolean"/>
    <property name="tvaNumber" length="80"/>
                
    <many-to-one name="company" class="comp.model.company.Company" column="idCompany" 
                             not-null="true"/>  
                
    <set name="tarifRailings"  table="customer_tarif" inverse="false" lazy="false" fetch="select" cascade="all">
        <key column="idCustomer"/>
        <many-to-many class="comp.model.accounting.Tarif" column="idTarif"/>
    </set>
                
</joined-subclass>

トリガー動作は、別の顧客の tarif にサブセット (サブセットの数は 1 より大きい必要があります) を持つ一連の tarif を持つ顧客を永続化しようとするときです。たとえば、顧客 1tarif #1 #2 #3 #4を持ち、顧客 #2は tarif #1 #5 #6 #7を持つことができますが、 #1 #2は のサブセットであるため、tarif #1 #2 #5 #6を持つことはできません#1 #2 #3 #4 . これがなぜなのか、現時点ではよくわかりません。

    **<The Function>**
    public static void addTarifToCustomer(Customer customer, Tarif tarif) throws UserServiceException, Exception {
    
                // Begin unit of work
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
                session.beginTransaction();
                    
                customer.addTarifRailing(tarifRailing);
                    session.saveOrUpdate(customer);
                entKeys = session.getStatistics().getEntityKeys();
                // End unit of work
                session.getTransaction().commit();
                
            } catch (ObjectNotFoundException ex) {
                HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
                throw new NotFoundDAOException("L'object d'identifiant " + customer.getIdSociety()
                        + " n'existe pas dans la base", ex);
            } catch (ConstraintViolationException ex) {
                HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
                throw new AlreadyExistDAOException("Nouvel identifiant déja existant en base", ex);
            } catch (Exception ex) {
                ex.printStackTrace();
                HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().rollback();
                throw new Exception(ex);
            }
        }

スタックトレースはこちら

4

1 に答える 1

0

@Luckaszスタックトレースから、これがこのようなものであることはすでに知っていましたが、これは継承されたプロジェクトであるため、別のインスタンスがロードされているかどうか、どこにあるかを特定するのは非常に困難でした。最終的には永続化/更新によってこれを回避する必要がありましたDAOレイヤーを通過するのではなく、アクションレイヤー(コントローラー)のオブジェクト。
これを回避する方法を見つけるのを手伝ってくれた irc チャンネルの sebersole に感謝します。

于 2012-09-02T13:01:53.373 に答える