Hibernate OMG

Hakan Uygun (hakan.uygun@ozguryazilim.com.tr)

Hibernate OMG!

Önce uyarılar!

Hibernate OMG ile hedeflenenler

  • NoSQL veri tabanları için tanıdık bir API sağlamak
  • Model sınıflarının tanımlanmasını bir motor üzerinden otomatik sağlamak
  • "Muhafazakar" kurumları, yeni veri kullanım desenlerini ve NoSQL konusunda teşvik etmek
  • Mevcut ilişkisel veri tabanı kullanan uygulamaların NoSQL kullanım yeteneği kazanarak ölçeklenebilmesini sağmalak

Farklı NoSQL türleri ve ürünleri karşısında hedef bütün hepsini aynı beceri ile desteklemek değil!

Mimari

Temel tarasarım kuralı : Mümkün olduğunca mevcut yapıları kullanmak!

Örnek Kod

Hemen bir örnek kod bakalım :


@Entity
public class Dog {
   @Id @GeneratedValue(strategy = GenerationType.TABLE, generator = "dog")
   @TableGenerator(
      name = "dog",
      table = "sequences",
      pkColumnName = "key",
      pkColumnValue = "dog",
      valueColumnName = "seed"
   )
   public Long getId() { return id; }
   public void setId(Long id) { this.id = id; }
   private Long id;

   public String getName() { return name; }
   public void setName(String name) { this.name = name; }
   private String name;

   @ManyToOne
   public Breed getBreed() { return breed; }
   public void setBreed(Breed breed) { this.breed = breed; }
   private Breed breed;
}

@Entity
public class Breed {

   @Id @GeneratedValue(generator = "uuid")
   @GenericGenerator(name="uuid", strategy="uuid2")
   public String getId() { return id; }
   public void setId(String id) { this.id = id; }
   private String id;

   public String getName() { return name; }
   public void setName(String name) { this.name = name; }
   private String name;
}
                  

Veri Saklama Modeli

MongoDB ile Kullanım


                
@Entity
public class News {
    @Id
    private String id;
    private String title;
    @Column(name="desc")
    private String description;
    @Embedded
    private NewsPaper paper;
    
    //getters, setters ...
}

@Embeddable
public class NewsPaper {
    private String name;
    private String owner;
    //getters, setters ...
}
                


 {
    "_id" : "1234-5678-0123-4567",
    "title": "On the merits of NoSQL",
    "desc": "This paper discuss why NoSQL will save the world for good",
    "paper": {
        "name": "NoSQL journal of prophecies",
        "owner": "Delphy"
    }
}
                

İlişkiler

Hibernate OGM, model ilişkilerini MongoDB için üç farklı strateji kullanarak saklıyor. Hangi stratejinin kullanılacağını hibernate.ogm.mongodb.associations.store ayarıyla değiştirilebilir. Seçeneklerimiz ise şunlar :

In Entity


            
@Entity
public class AccountOwner {
@Id
private String id;

@ManyToMany
public Set<BankAccount> bankAccounts;

//getters, setters, ...

            


{
    "_id" : "owner0001",
    "bankAccounts" : [
        { "bankAccounts_id" : "accountXYZ" }
    ]
}
            

In Entity

Tek Yönlü :


{
    "_id": {
        "owners_id": "owner0001",
        "table": "AccountOwner_BankAccount"
    },
    "rows": [
        { "bankAccounts_id": "accountXYZ" }
    ]
}
            

Çift Yönlü :


{
    "_id": {
        "owners_id": "owner0001",
        "table": "AccountOwner_BankAccount"
    },
    "rows": [{
        "bankAccounts_id": "accountXYZ"
        }]
}
{
    "_id": {
        "bankAccounts_id": "accountXYZ",
        "table": "AccountOwner_BankAccount"
    },
    "rows": [{
        "owners_id": "owner0001"
    }]
}
            

Sorgular

Şu anda Hibernate OMG MongoDB sorgularını desteklemiyor ama JP-QL ile MongoDB sorgusu yazılması konusunda çalışmalar sürüyor. Mevcut durumda kullanılabilecek iki yöntem var :

Sorular?

Hibernate OMG ile ilgi daha fazla bilgi için http://www.hibernate.org/subprojects/ogm adresini ziyaret edebilirsiniz!