Je me demande comment mieux implémenter une propriété (ici, LatestRequest
) qui est en lecture seule, soutenue par une requête.Comment mapper une propriété en lecture seule soutenue par une requête dans Hibernate
Ici, j'ai un export, qui peut être demandé plusieurs fois. Je voudrais avoir une propriété sur l'exportation pour obtenir la dernière ExportRequest
. En ce moment, j'ai many-to-one mapping avec une formule, comme ceci:
<class name="Export" table="Exports">
<id name="Id">
<generator class="guid" />
</id>
<property name="Name" />
<bag name="Requests" cascade="all,delete-orphan" inverse="true" access="field.camelcase" order-by="CreationDate desc">
<key column="ExportId"/>
<one-to-many class="ExportRequest"/>
</bag>
<many-to-one name="LatestRequest"
class="ExportRequest"
formula="(select top 1 ExportRequests.Id from ExportRequests order by ExportRequests.CreationDate desc)"/>
</class>
<class name="ExportRequest" table="ExportRequests">
<id name="Id">
<generator class="native" />
</id>
<many-to-one name="Export"
class="Export"
column="ExportId"
not-null="true" />
<property name="CreationDate" />
<property name="Tag" />
</class>
Cependant, depuis le ExportRequests.Id
pour LatestRequest
est chargé lorsque l'exportation est tiré par les cheveux, ce modèle d'accès renvoie des données périmées :
var export = session.Get<Export>(exportId);
export.AddRequest(new ExportRequest(DateTime.Now, "Foo"));
Assert.AreEqual("Foo", export.LatestRequest.Tag); // fails due to stale data
session.Update(export);
Alors, quelle est la meilleure façon de mettre en œuvre la propriété LatestRequest
?
Je pourrais changer le getter pour LatestRequest
afin qu'il exécute une requête Find
, qui devrait être à jour, mais je ne suis pas sûr comment faire l'exportation consciente de la session.