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.
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. –
@Chandru Haritalamalarınızı ** ve ** oluşturulan SQL gösterebilir misiniz? –
Bilgileri eklemek için soruma güncel bilgilerdeyim. –