2016-03-22 31 views
3

@Formula ek açıklamasını aşağıda basit bir kod parçası kullanarak nasıl çalıştığını görmeye çalışıyorum.Hazırda @Formula, Hazırda Bekleme/JPA

Açıklama değerlerini ve bidAmount sütunlarını yazdırabilirim, ancak @Formula i.e. shortDescription ve averageBidAmount return null ile açıklamalı alanlar.

Buradaki kodun nesi yanlış olduğuna işaret eden herhangi bir kişi yardım edebilir mi? Bir Mac OSX'te Hibernate 5.0, postgresql-9.3-1102-jdbc41 ve TestNG kullanıyorum.

import java.math.BigDecimal; 
    import java.util.List; 
    import javax.persistence.Entity; 
    import javax.persistence.EntityManager; 
    import javax.persistence.EntityManagerFactory; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.Id; 
    import javax.persistence.Persistence; 
    import javax.transaction.UserTransaction; 
    import org.testng.annotations.Test; 
    import com.my.hibernate.env.TransactionManagerTest; 

    public class DerivedPropertyDemo extends TransactionManagerTest { 

     @Test 
     public void storeLoadMessage() throws Exception { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("HelloWorldPU"); 
     try { 
      { 
      UserTransaction tx = TM.getUserTransaction(); 
      tx.begin(); 
      EntityManager em = emf.createEntityManager(); 

      DerivedProperty derivedProperty1 = new DerivedProperty(); 
      derivedProperty1.description = "Description is freaking good!!!"; 
      derivedProperty1.bidAmount = BigDecimal.valueOf(100D); 

      DerivedProperty derivedProperty2 = new DerivedProperty(); 
      derivedProperty2.description = "Description is freaking bad!!!"; 
      derivedProperty2.bidAmount = BigDecimal.valueOf(200D); 

      DerivedProperty derivedProperty3 = new DerivedProperty(); 
      derivedProperty3.description = "Description is freaking neutral!!!"; 
      derivedProperty3.bidAmount = BigDecimal.valueOf(300D); 

      em.persist(derivedProperty1); 
      em.persist(derivedProperty2); 
      em.persist(derivedProperty3); 

      tx.commit(); 

      for (DerivedProperty dp : getDerivedProperty(em)) { 
       System.out.println("============================"); 
       System.out.println(dp.description); 
       System.out.println(dp.bidAmount); 
       System.out.println(dp.getShortDescription()); 
       System.out.println(dp.getAverageBidAmount()); 
       System.out.println("#############################"); 
      } 
      em.close(); 
      } 
     } finally { 
      TM.rollback(); 
      emf.close(); 
     } 
     } 


    public List<DerivedProperty> getDerivedProperty(EntityManager em) { 
     List<DerivedProperty> resultList = em.createQuery("from " + DerivedProperty.class.getSimpleName()).getResultList(); 
     return resultList; 
    } 
} 

Benim Varlık sınıftır:

kitapta takip ediyorum

@Entity 
class DerivedProperty { 

    @Id 
    @GeneratedValue 
    protected Long id; 

    protected String description; 

    protected BigDecimal bidAmount; 

    @org.hibernate.annotations.Formula("substr(description, 1, 12)") 
    protected String shortDescription; 

    @org.hibernate.annotations.Formula("(select avg(b.bidAmount) from DerivedProperty b where b.bidAmount = 200)") 
    protected BigDecimal averageBidAmount; 

    public String getShortDescription() { 
    return shortDescription; 
    } 

    public BigDecimal getAverageBidAmount() { 
    return averageBidAmount; 
    } 
} 

DÜZENLEME Java Persistence with Hibernate 2nd Ed.

enter image description here

Teşekkür

cevap

1

DerivedProperty örnekleriniz, kalıcılık içeriğinden döndürülür (yalnızca onların kimlikleri, sorgudan döndürülen sonuç kümesinden kullanılır). Bu yüzden formüller değerlendirilmemiştir.

Varlık yöneticisini kapatmazsanız, süreklilik içeriği temizlenmez. Kalıcılık içeriğini temizlemeye zorlamak için ilk işlemi gerçekleştirdikten sonra em.clear() eklemeyi deneyin.

+0

Hack! Bütün bunları nereden öğrendiğinizi bilmiyorum. Bunu saatlerce bekliyorum. :( – EMM

İlgili konular