20 Eylül 2018 Perşembe

@LazyCollection Anotasyonu

Giriş
Eager yükleme için kullanılır. Normalde JPA'nın şu özelliğini kullanmak daha iyi
@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY, orphanRemoval = true)
value Alanı
Örnek
OneToMany ile kullanılabilir. Şöyle yaparız.
@Entity(name = "product")
@Table(name = "products", schema = "${DB_NAME}", catalog = "")
public class ProductEntity {
  ...
  private List shipments = new ArrayList<>();

  
  @OneToMany(mappedBy = "shipmentID", targetEntity=ShipmentEntity.class)
  @LazyCollection(LazyCollectionOption.FALSE)
  public Collection<ShipmentEntity> getShipments() { ... }
  public void setShipments(Collection<ShipmentEntity> shipments) { ... }
  ...
}
Örnek LazyCollectionOption.FALSE
ManyToMany ile kullanılabilir. Şöyle yaparız.
@Entity
public class Product implements Serializable {
 ...

  @ManyToMany
  @LazyCollection(LazyCollectionOption.FALSE)
  @JoinTable(joinColumns = @JoinColumn(name = "productId"),
    inverseJoinColumns = @JoinColumn(name = "colorId"))
 private List<Color> colorList;
  ...
}
@Entity
public class Color implements Serializable {
  ... 
  @ManyToMany(mappedBy="colorList")
  private List<Product> productList;
}
OneToMany
OneToMany ile kullanılabilir. Şöyle yaparız.
@Entity
@Table(name = "COMPANY")
public class Company {


  @OneToMany
  @LazyCollection(LazyCollectionOption.FALSE)
  @JoinTable(name = "COMPANY_2_LOCATIONS",
    joinColumns = {@JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID")},
    inverseJoinColumns = {@JoinColumn(name = "LOCATION_ID", referencedColumnName = "ID")})
  private List<Location> locations;
  ...

}

19 Eylül 2018 Çarşamba

Configuration Sınıfı - hibernate.cfg.xml Dosyasını Yükler

Giriş
Şu satırı dahil ederiz.
import org.hibernate.cfg.Configuration;
hibernate.properteis veya hibernate.cfg.xml dosyasını okuyarak SessionFactory nesnesi yaratır.
Bu sınıf bir ara AnnotationConfiguration olarak bölündü ancak daha sonra tüm işlev tekrar bu sınıfta toplandı.

Kullanım
hibernate.properties dosyasını okumak için eski kodlarda şu çağrılar yapılır.
constructor() -> addDirectory() -> buildSessionFactory ()
hibernate.cfg.xml dosyasını okumak için yeni kodlarda şu çağrılar yapılır
constructor() -> configure() -> addDirectory() -> buildSessionFactory ()
Örnek
src/main/resources/test-hibernate-client.cfg.xml dosyasını yüklemek için şöyle yaparız
SessionFactory createSessionFactory(Properties props) {
  Configuration conf = new Configuration();
  conf.configure(Foo.class.getClassLoader().getResource("test-hibernate-client.cfg.xml"));
  conf.addAnnotatedClass(Foo.class);
  conf.addProperties(props);

  SessionFactory sessionFactory = conf.buildSessionFactory();
  sessionFactory.getStatistics().setStatisticsEnabled(true);
  return sessionFactory;
}

constructor
hibernate.properties dosyasını yükler
Örnek
Şöyle yaparız.
Configuration cfg =new Configuration();
Örnek
Dosya yüklendiği için şöyle yapabiliriz.
Properties properties = configuration.getProperties();
addAnnotatedClass metodu
Örnek
Şöyle yaparız.
new Configuration().configure("hibernateUser.cfg.xml")
 .addAnnotatedClass(AppUser.class)
 .buildSessionFactory();
Örnek
Şöyle yaparız.
sessionFactory = new Configuration()
  .configure()
  .addAnnotatedClass(Seller.class)
  .addAnnotatedClass(Book.class)
  .buildSessionFactory();
addClass metodu
Tüm yolu belirtilen belirtilen sınıfa ait hbm.xml dosyasını ekler.

addDirectory metodu
hbm.xml dosyalarını içeren dizinleri belirtir. Bu dizinler taranarak dosyalar yüklenir.

addPackage metodu
İnsanın aklı Spring'e gidiyor ancak bu metod ismi belirtilen paketteki sınıfları taramaz. Sınıfları eklemek için şöyle yaparız.

addURL metodu
hbm.xml dosyası jar içindeyse eklemek için kullanılır.

buildSessionFactory metodu - Eski
Bu metodu kullanmamak lazım.
Örnek
Şöyle yaparız.
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

Örnek
Şöyle yaparız.
sqlProps.put("hibernate.connection.driver_class", "org.h2.Driver");
sqlProps.put("hibernate.hbm2ddl.auto", "update");
sqlProps.put("hibernate.connection.url", "jdbc:h2:test;CIPHER=AES");
sqlProps.put("hibernate.connection.username", "TEST");

sqlProps.put("hibernate.connection.password", "testAES test");
sqlProps.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");

//Pooling
sqlProps.put("hibernate.c3p0.min_size", "5");
sqlProps.put("hibernate.c3p0.max_size", "20");
sqlProps.put("hibernate.c3p0.timeout", "300");
sqlProps.put("hibernate.c3p0.max_statements", "50");
sqlProps.put("hibernate.c3p0.idle_test_period", "3000");
sqlProps.put("hibernate.temp.use_jdbc_metadata_defaults", "false");

org.hibernate.cfg.Configuration cfg =
  new org.hibernate.cfg.Configuration()
    .addAnnotatedClass(Apartment.class)
    .addAnnotatedClass(Housing.class)
    .addAnnotatedClass(Landlord.class)
    .addAnnotatedClass(Tenant.class)
    .addAnnotatedClass(Transaction.class)
    .mergeProperties(sqlProps);

SessionFactory sessionFactory = cfg.buildSessionFactory();

buildSessionFactory metodu - ServiceRegistry
Örnek
Şöyle yaparız.
private static SessionFactory buildSessionFactory() {
  try {
    Configuration configuration = new Configuration();
    ServiceRegistry serviceRegistry
            = new StandardServiceRegistryBuilder()
                .applySettings(configuration.getProperties()).build();
    configuration.addAnnotatedClass(LookUpModel.class);
    return configuration
           .buildSessionFactory(serviceRegistry);
  }catch(Exception e) {
    e.printStackTrace();
    throw new RuntimeException("There is issue in hibernate util");
  }
}
Örnek

Şöyle yaparız.
configuration.buildSessionFactory(
    new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties())
        .build()
);

Örnek
Şöyle yaparız.
SessionFactory sf = new Configuration().configure().buildSessionFactory(
            new StandardServiceRegistryBuilder().build() );
configure metodu 
resources dizininde hibernate.cfg.xml dosyası bulunur. hibernate.cfg.xml dosyasını yükler.
Örnek
Şöyle yaparız.
Configuration configuration = new Configuration().configure();
Örnek
Şöyle yaparız.
// Create the SessionFactory from standard (hibernate.cfg.xml) config file.
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
configure metodu - String
Belirtilen dosyayı okur

Örnek
Şöyle yaparız.
Configuration configuration=new Configuration().configure("myhibernate.cfg.xml");
SessionFactory sessionFactory=configuration.buildSessionFactory();`
Dosya şöyledir. Hibernate xml dosyası şöyledir.

generateDropSchemaScript metodu
Bu metod Hibernate 5 ile silindi.

generateSchemaCreationScript metodu
Bu metod Hibernate 5 ile silindi.

setProperties metodu
Kullanılacak değerler java.util.Properties sınıfı ile belirtilir.