24 Ocak 2016 Pazar

JDBC Gün Saat Sınıfları

JDBC Gün Saat Sınıfları
JDBC ile kullanılabilen gün saat sınıfları arasındaki ilişki aşağıdaki gibidir.

PreparedStatement arayüzü sadece java.sql.Date ve java.sql.Timestamp parametreleri alan metodlara sahip ancak yukarıda da görülen kalıtım ilişkisi sayesinde java.sql.Date sınıfı java.util.Date sınıfına çevirilebiliyor.

Date Sınıfı
java.sql.Date Sınıfı yazısına taşıdım.

Timestamp sınıfı
java.sql.Timestamp Sınıfı yazısına taşıdım.

ResultSet ve get metodları
getDate() metodu java.sql.Date sınıfını (yani sadece gün bilgisini) döndürür. getTimeStamp() metodu java.sql.Timestamp sınıfını (yani gün ve saat bilgisini) döndürür.
getTime() metodu ise java.sql.Time  sınıfını (yani sadece saat bilgisini) döndürür

setTimestamp metodu
JDBC sürücüsüleri arasında TimeStamp değerini kaydederken saat diliminin nasıl hesaba katılması konusunda tutarlılık yok. Örneğin MySQL sürücüsü atanan değeri veritabanının saat dilimine göre ayarlıyor.Saat dilimini UTC olarak kaydetmek için aşağıdaki gibi yapılabilir.
stmt.setTimestamp(1, timestamp, Calendar.getInstance(TimeZone.getTimeZone("UTC")))
Calendar parametresi şu işe yarıyor.

With a Calendar object, the driver can calculate the timestamp taking into account a custom timezone. If no Calendar object is specified, the driver uses the default timezone, which is that of the virtual machine running the application.

getTimeStamp metodu
UTC olarak geri okumak için aşağıdaki gibi yapılabilir.
Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
while(rs.next())
    rs.getTimestamp("utctime",utcCal);



14 Ocak 2016 Perşembe

Process Sınıfı

getInputStream metodu
Çağrılan uygulamanın çıktısı şöyle okunur.
InputStream stdout = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
String line;
while ((line = reader.readLine())!= null) {
   ...
}
p.waitFor();
waitFor
Uygulamanın bitmesi şöyle beklenir.
p.waitFor();

13 Ocak 2016 Çarşamba

JVM Havuzları

Giriş
JVM içinde bir çok havuz mevcut.

Havuzlar Arası Aktarım
Nesneler havuzlar arasında aktarılabilir. Bu aktarımların nesne referans karşılaştırmasına etkisi yoktur. Elimizde iki nesne olsun. Bu nesneler karşılaştırmanın ortasında başka havuzlara taşınsın. Aşağıdaki kod sorunsuz çalışır.
Foo foo = new Foo();
Foo bar = foo;
if(foo == bar) {
    System.out.println("true");
}



7 Ocak 2016 Perşembe

JPA OneToOne İlişki

OneToOne İlişki
OneToOne ilişki tek veya çift yönlü olabilir.

Unidirectional İlişki
Şöyle tanımlarız.
@Entity
@Table(name = Membership_Profile)
class MembershipProfile {
   Long moduleMembershipId;
   String displayName;
   // Other properties if needed
}
ve
@Entity
class PokerProfile {
   @OneToOne(fetch=FetchType.LAZY)
   @JoinColumn(name = "membershipId")
   MembershipProfile membershipProfile;
   ...
}
PokerProfile nesnesi JoinColumn ile hangi membership profile nesnesini ile ilişkili olduğunu bilir.

Bidirectional İlişki
Örnek'te bir kişi ve ehliyeti var. Yine mappedBy ile diğer sınıftaki alanı veriyoruz.
@Entity
@Table(name = "PERSON")
public class Person {
    @OneToOne(mappedBy = "person", cascade = CascadeType.ALL)
    private DrivingLicense drivingLicense;
}

@Entity
@Table(name = "DRIVING_LICENSE")
public class DrivingLicense {
    @OneToOne
    @JoinColumn(name = "PERSON_ID", unique = true)
    private Person person;
}
OneToOne İlişki ve orphanRemoval = true
Yukarıdaki örnekte Person nesnesinin DrivingLicense alanı null yapılırsa DrivingLicense nesnesi de silinir.

OneToOne İlişki ve CascadeType.ALL
CascadeType.All eğer Person nesnesi silinirse ona bağlı olan DrivingLicense nesnesinin de otomatik olarak silinmesini sağlar. Ancak orphanRemoval'dan biraz farklıdır. orphanRemoval ile drivingLicense alanını null yapsak bile ehliyet nesnesinin silinmesi sağlanır. 

CascadeType.All ile drivingLicense alanını null yaparsak aradaki bağı biz koparttığımız için DrivingLicense nesnesi veritabanında kalır yani silinmez.


Not : Eğer session.delete(entity); yaparsak DrivingLicense nesnesini silmeye çalışırsak  "org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)" hatasını alırız.

Bu hatanın sebebi OneToOne olan bir ilişkinin tek tarafını kırmaya çalışmamızdan kaynaklanıyor.

Çözüm olarak OneToMany ilişki kullanılması yeterli.