2010-02-18 9 views
8

Diyelim ki iki tane var, Employee ve Skill. Her çalışanın bir takım becerileri vardır. Şimdi becerilerimi Employee örneklerinden sonuna kadar yüklediğimde, önbellek Employee'un farklı örneklerinde beceriler için kullanılmaz.Hazırda bekletilen koleksiyonlar için ikinci düzey önbellek Hazırda bekletme modunda nasıl kullanılır?

Aşağıdaki veri kümesini ele alalım. Çalışan sonra 2 - - Ben Çalışan yüklediğinizde

Employee - 1 : Java, PHP 
Employee - 2 : Java, PHP 

1, ben becerileri almak ve bunun yerine önbellekte zaten mevcut Skill örneklerini kullanmak için veritabanı vurmak kış uykusuna istemiyoruz. Mümkün mü? Öyleyse nasıl?

hazırda Yapılandırma İkinci Çalışan ve onun Becerileri Yükleme için

@Entity 
@Table(name = "employee") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Employee { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    private String name; 

    public Employee() { 
    } 

    @ManyToMany 
    @JoinTable(name = "employee_skills", joinColumns = @JoinColumn(name = "employee_id"), inverseJoinColumns = @JoinColumn(name = "skill_id")) 
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
    private List<Skill> skills; 
} 

@Entity 
@Table(name = "skill") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Skill { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    private String name; 
} 

SQL kaldırıldı

<session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">pass</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost/cache</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 

    <property name="hibernate.cache.use_second_level_cache">true</property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <property name="hibernate.show_sql">true</property> 

    <mapping class="org.cache.models.Employee" /> 
    <mapping class="org.cache.models.Skill" /> 
</session-factory> 

ithalat, alıcılar ile Entities ve ayarlayıcılar

Hibernate: select employee0_.id as id0_0_, employee0_.name as name0_0_ from employee employee0_ where employee0_.id=? 
Hibernate: select skills0_.employee_id as employee1_1_, skills0_.skill_id as skill2_1_, skill1_.id as id1_0_, skill1_.name as name1_0_ from employee_skills skills0_ left outer join skill skill1_ on skills0_.skill_id=skill1_.id where skills0_.employee_id=? 

Özellikle ikinci sorgudan kaçınmak istiyorum çünkü birincisi kaçınılmaz olarak zaten kaçınılmaz.

cevap

4

Employee--<>Skills ilişkilendirmesini önbelleleştirmeniz gerekir. dillerin iç

<hibernate-mapping package="com.wakaleo.articles.caching.businessobjects"> 
    <class name="Employee" table="EMPLOYEE" dynamic-update="true"> 
     <meta attribute="implement-equals">true</meta>  

     <id name="id" type="long" unsaved-value="null" > 
      <column name="emp_id" not-null="true"/> 
      <generator class="increment"/> 
     </id> 

    <property column="emp_surname" name="surname" type="string"/> 
    <property column="emp_firstname" name="firstname" type="string"/> 

    <many-to-one name="country" 
      column="cn_id" 
       class="com.wakaleo.articles.caching.businessobjects.Country" 
      not-null="true" /> 

    <!-- Lazy-loading is deactivated to demonstrate caching behavior -->  
    <set name="languages" table="EMPLOYEE_SPEAKS_LANGUAGE" lazy="false"> 
     <cache usage="read-write"/> 
     <key column="emp_id"/> 
      <many-to-many column="lan_id" class="Language"/> 
    </set>        
    </class> 
</hibernate-mapping> 

Not <cache> eleman: Örnek altında Speed Up Your Hibernate Applications with Second-Level Caching alınan.

+0

Bunu zaten yaptım. Sorguyu, yalnızca önceden yüklenmiş olan çalışanlar için önler. Önbellekte olmayan ve aynı zamanda önbellekte zaten çalışan başka bir çalışanla aynı becerilere sahip olmayan çalışanlar. İlk örneğimde Çalışanı - 1 tekrar yüklediğimde ancak Çalışanı yüklediğimde çalışmaz - 2. –

+0

@Chandru Haritalamalarınızı ** ve ** oluşturulan SQL gösterebilir misiniz? –

+0

Bilgileri eklemek için soruma güncel bilgilerdeyim. –

İlgili konular