Odwzorowania relacyjno-obiektowe Hibernate uzupełnienie Plan wykładu • • • • • 2 Odwzorowania relacyjno-obiektowe Dziedziczenie Konfiguracja Statystyki MetaDane Nazewnictwo 2 Odwzorowania relacyjno-obiektowe Dziedziczenie (I) • @Inheritance • (strategy=InheritanceType.TABLE_PER_CLASS) • (strategy=InheritanceType.JOINED) • (strategy=InheritanceType.SINGLE_TABLE) 3 Odwzorowania relacyjno-obiektowe 4 Dziedziczenie (II) @Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "type") public class Slownik { @Id @SequenceGenerator(name = "Slownik_SEQUENCE", sequenceName = "slownik_seq") @GeneratedValue(generator = "Slownik_SEQUENCE") private int id; private String nazwa; } Odwzorowania relacyjno-obiektowe Dziedziczenie (III) @Entity @DiscriminatorValue(”typProcesora") public class TypProcesora extends Slownik {} TypProcesora slownik = null; if (slownikId == -1) slownik = new TypProcesora(); else slownik = (TypProcesora) slownikService.get(slownikId); Slownik slownik = slownikService.get(slownikId); 5 Odwzorowania relacyjno-obiektowe Dziedziczenie (IV) - TABLE_PER_CLASS • Oddzielna tabela w bazie danych dla każdej klasy dziedziczącej • Mniejsze wykorzystanie pamięci w bazie danych • Prostszy import danych, łatwiejsza administracja bazą danych • Niska efektywność zapytań 6 Odwzorowania relacyjno-obiektowe Dziedziczenie (V) - SINGLE_TABLE • Pojedyncza tabela w bazie danych dla wszystkich klas dziedziczących • Znaczna liczba pustych komórek w tabeli (kolumny tabeli są sumą kolumn dla każdej klasy) • Dodatkowa kolumna dtype z nazwa klasy • Trudności w imporcie danych • Wysoka efektywność zapytań 7 Odwzorowania relacyjno-obiektowe 8 Konfiguracja (I) <prop key="hibernate. show_sql">true</prop> hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect hibernate.default_schema = example hibernate.hbm2ddl.auto = update hibernate.show_sql = false hibernate.format_sql = false 8 Odwzorowania relacyjno-obiektowe 9 Konfiguracja (II) hibernate.connection.isolation hibernate.generate_statistics = true hibernate.jdbc.batch_size 20 hibernate.default_batch_fetch_size hibernate.cache.use_query_cache hibernate.cache.use_second_level_cache 9 10 Odwzorowania relacyjno-obiektowe Konfiguracja (III) <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=300 hibernate.c3p0.max_statements=50 hibernate.c3p0.idle_test_period=300 10 Odwzorowania relacyjno-obiektowe 11 Loging log4j.logger.org.hibernate.tool.hbm2ddl = error org.hibernate org.hibernate.SQL org.hibernate.type org.hibernate.cache org.hibernate.secure org.hibernate.jdbc org.hibernate.transaction 11 Odwzorowania relacyjno-obiektowe Statystyka • getHibernateTemplate().getSessionFactory() .getStatistics() • • • • isStatisticsEnabled() getEntityLoadCount() getTransactionCount() getSuccessfulTransactionCount() 12 Odwzorowania relacyjno-obiektowe MetaDane ClassMetadata uMeta = sessionfactory.getClassMetadata(Uzytkownik.class); Object[] propertyValues = uMeta.getPropertyValues(uzytkownik); String[] propertyNames = uMeta.getPropertyNames(); Type[] propertyTypes = uMeta.getPropertyTypes(); 13 Odwzorowania relacyjno-obiektowe Naming Strategy (I) public class MyNamingStartegy extends DefaultNamingStrategy { @Override public String classToTableName(String className) { return "kura_" + super.classToTableName(className); } ... 14 Odwzorowania relacyjno-obiektowe Naming Strategy (II) <bean id="naming" class=”commons.MyNamingStartegy"> </bean> <bean id="hibernateSessionFactory” ...> ... <property name="namingStrategy" ref ="naming"></property> .... 15 Odwzorowania relacyjno-obiektowe batch-size • Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); for ( int i=0; i<100000; i++ ) { Uzytkownik uzytkownik = new Uzytkownik(.....); session.save(uzytkownik); if ( i % 20 == 0 ) { session.flush(); session.clear(); }} tx.commit(); session.close(); 16 Odwzorowania relacyjno-obiektowe First-level Cache • getHibernateTemplate().evict(Object) • getHibernateTemplate().clear() 17 Odwzorowania relacyjno-obiektowe Second-level Cache • getHibernateTemplate().getSessionFactory().evict (Haslo.class); //deprecated • getHibernateTemplate().getSessionFactory().evict (Haslo.class,id); //deprecated 18 Odwzorowania relacyjno-obiektowe Query cache Query uzytkownikByImie = session.createQuery("from Uzytkownik u where u.imie = :imie"); uzytkownikByImie.setString(”Marek", imie); uzytkownikByImie.setCacheable(true); uzytkownikByName.setCacheRegion ("UzytkownikQueries") 19 Odwzorowania relacyjno-obiektowe Exception • DBCConnectionException - wskazuje błąd komunikacji na poziomie JDBC • SQLGrammarException - wskazuje problem z gramatyką i składną polecenia SQL. • ConstraintViolationException - naruszenie integralności danych • LockAcquisitionException - problem naruszenie (nabycia) blokady • GenericJDBCException - inne 20