Hibernate changer de mode de lecture en mode exécution
J'ai deux tables liées ensemble à l'aide d'un-à-plusieurs relation :
employé -> département : et par rapport department_id dans la table employee.
J'utilise hibernate : et mes fichiers de mapping hibernate sont:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping default-lazy="false">
<class catalog="moi"
name="com.ebla.moi.correspondence.model.entity.user.User" table="user">
<id name="id" type="java.lang.Long">
<column name="id"/>
<generator class="identity"/>
</id>
<many-to-one
class="com.ebla.moi.correspondence.model.entity.department.Department"
fetch="select" name="department">
<column name="department_id"/>
</many-to-one>
<property generated="never" lazy="false" name="name" type="java.lang.String">
<column length="128" name="name" not-null="true"/>
</property>
<property generated="never" lazy="false" name="email" type="java.lang.String">
<column length="128" name="email" not-null="true" unique="true"/>
</property>
<property generated="never" lazy="false" name="maritalStatus" type="java.lang.Short">
<column name="marital_status" not-null="true"/>
</property>
<property generated="never" lazy="false" name="hireDate" type="java.lang.String">
<column length="64" name="hire_date"/>
</property>
</class>
</hibernate-mapping>
et le deuxième fichier de mappage est :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping default-lazy="false">
<class catalog="moi"
name="com.ebla.moi.correspondence.model.entity.department.Department" table="department">
<id name="id" type="java.lang.Long">
<column name="id"/>
<generator class="identity"/>
</id>
<property generated="never" lazy="false" name="name" type="java.lang.String">
<column length="256" name="name" unique="true"/>
</property>
<set inverse="true" name="users" sort="unsorted">
<key>
<column name="department_id"/>
</key>
<one-to-many class="com.ebla.moi.correspondence.model.entity.user.User"/>
</set>
</class>
</hibernate-mapping>
Mon problème est le suivant : parfois, j'ai besoin d'obtenir de l'employé à son service, et d'autres fois, j'ai besoin que l'employé de l'information avec des informations de service..... et la même chose avec le ministère de l'employé.... en utilisant le fichier de mappage au-dessus de la veille prolongée amener le ministère et c'est aux utilisateurs si j'ai besoin de l'employé ou pas... comment définir mon besoin d'hibernate pour aller chercher juste ce dont j'ai besoin...
merci
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mapper la relation comme "paresseux" et écrivez deux requêtes pour obtenir vos données:
L'habitude simple requête pour récupérer vos données ("paresseux"). E. g. "select e from Employee e où ..."
La même requête à l'aide de "récupération de se joindre" à force d'Hibernation pour chercher "childs". E. g. "select e from Employee left join fetch e.département où ..."
LLP, Andrea
Vous pouvez utiliser ICriteria chercher votre Employé.
Vous pouvez utiliser la méthode SetFetchMode de la ICriteria pour déterminer si le Ministère doit être récupérée, ou pas:
Cela permettra de s'assurer que le Ministère n'est pas récupérée:
Avec ce code, le ministère sera récupérée.
Certains disent qu'il est préférable d'utiliser la valeur par défaut fetchmode dans les mappages (qui serait paresseux, je suppose), et de spécifier le fetch-mode dans chaque scénario. (Qui est, dans vos dépôts).
Une façon de le faire est d'avoir deux classes représentant d'un employé:
Employee
qui a ministère de l'information cartographiée grâce;EmployeeSummary
, qui ne contient que les données de l'employé lui-même.Les deux classes ont ensuite indépendants les liaisons sur le
employee
table, mais seulementEmployee
a aussi la relation surdepartment
défini.Puis, quand vous avez besoin de toutes les informations dont vous avez la charge
Employee
cas, et si vous avez seulement besoin de renseignements sur les employés vous chargezEmployeeSummary
instances.Vous pouvez supprimer la duplication de l'ORM liaisons et logique d'entreprise par l'introduction d'une super-classe commune comme
AbstractEmployee
à la fois de la catégorie d'employés.Je pense que ce que vous cherchez est extraction de profils
. Aussi jeter un oeil sur cet exemple : http://arjan-tijms.omnifaces.org/2012/04/fetching-arbitrary-object-graphs-in-jpa.html