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.