Hakan Uygun (hakan.uygun@ozguryazilim.com.tr)
Önce uyarılar!
Farklı NoSQL türleri ve ürünleri karşısında hedef bütün hepsini aynı beceri ile desteklemek değil! |
Temel tarasarım kuralı : Mümkün olduğunca mevcut yapıları kullanmak!
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;
}
@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"
}
}
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 :
@Entity
public class AccountOwner {
@Id
private String id;
@ManyToMany
public Set<BankAccount> bankAccounts;
//getters, setters, ...
{
"_id" : "owner0001",
"bankAccounts" : [
{ "bankAccounts_id" : "accountXYZ" }
]
}
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"
}]
}
Ş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 :
Hibernate OMG ile ilgi daha fazla bilgi için http://www.hibernate.org/subprojects/ogm adresini ziyaret edebilirsiniz!