2016-04-11 19 views
2

Giriş varlığım ve Yorum varlığım var.Hazırda bekleyen büyük koleksiyonları nasıl ele alır

/deleteComment?entryId=5&commentId=7 

Benim yaklaşım denetleyicisi olacaktır:

@Entity 
@Table(name="entries") 
public class Entry { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="id") 
    private int id; 

    @OneToMany(mappedBy = "entry", cascade = CascadeType.ALL, orphanRemoval = true) 
    @LazyCollection(LazyCollectionOption.EXTRA) 
    private List<Comment> comments = new ArrayList<>(); 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public List<Comment> getComments() { 
     return comments; 
    } 

    public boolean containsComment(int commentId) { 
     return comments.contains(commentId); 
    } 

    public Comment getComment(int commentId) { 
     return comments.get(commentId); 
    } 

    public void removeComment(Comment comment) { 
     comments.remove(comment); 
    } 
} 


@Entity 
@Table(name="comments") 
public class Comment { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    public int id; 

    @ManyToOne 
    private Entry entry; 

    public int getId() { 
     return this.id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public Entry getEntry() { 
     return entry; 
    } 

    public void setEntry(Entry entry) { 
     this.entry = entry; 
    } 
} 

Ben arka uca aşağıdaki isteği göndermek Tek Sayfa App bildiğinizi varsayalım: Entry varlık Yorum varlığa bir OneToMany ilişkisi var EntranceId param ile girişi almak için. Giriş-varlık içeriklerini çağırmak istiyorumComment() -) - commentId istek parametresini geçirdiğim yöntem. Bu nedenle, koleksiyonlar verilen kimlikle veya false ile bir yorum içeriyorsa, doğru olurdum. Doğruysa Yorum varlığını almak için getComment() - yöntemini çağırırdım. Son olarak, Comment varlık olarak parametre olarak removeComment() - yöntemini çağırırdım.

PHP Doktrini'nde bu yaklaşımın işe yaradığını düşünüyorum. Bu da hazırda beklemede doğru bir yol mu? Yorumlar hızla geniş bir koleksiyona alabilirsiniz çünkü EKSTRA-tembel çalışmak

org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [public int com.mypackage.Comment.id] by reflection for persistent property [com.mypackage.Comment#id] : 7 

Not: Aşağıdaki kod örneğinde

ben aşağıdaki özel durum alıyorum containsComment() yöntemini çağırırsanız

.

cevap

3

Bunu bir sorguyla yapabilirdiniz, ör. Comment, Entry'a bir referansa sahipse select c from Comment c where c.id = :commentId and c.entry.id = :entryId gibi bir şey kullanın - eğer bu yorumu alırsanız o zaman var ve hemen kullanabilirsiniz.

Yorumu silmek kolaydır, sadece yapın. Comment, silme ilişkisinin sahibi olduğundan, onu girişten de etkin bir şekilde kaldıracaktır.

Tavsiye olsa bir kelime: HQL/JPQL sorguları id özellikleri için id anahtar sözcüğünü kullanın. Durumunuzda, id'dan beri @Id ile açıklamalıdır. Ancak, başka bir @Id alana sahipseniz, sorgu,alan (ları) anlamına geldiğinizi varsayalım diye bir sorguda id kullandığından beklediğinizden farklı davranacaktır.

Nihayet comments.contains(commentId) bir sidenote: listeleri gibi Java koleksiyonları normalde parametre olarak ancak koleksiyonu beri geçen elemanın arayacağı bir List<Comment> olduğunu ve (bir int olan) bir kimliği o bulunmamalıdır geçmektedir. Hibernate koleksiyonlarının bazı özel çeviri mantığı kullanıp kullanmadığını, ancak aramanın gerçekte geri dönmesini beklemediğiniz bir hata gibi görünen bir Java programcısına çalışıp çalışmadığından emin değilim ("Elmaların listesi bu turuncuyu içeriyor mu?" .

İlgili konular