Java 如何在Hibernate/JPA中使用@Formula
我试图通过下面一段简单的代码来了解Java 如何在Hibernate/JPA中使用@Formula,java,hibernate,Java,Hibernate,我试图通过下面一段简单的代码来了解@Formula注释是如何工作的 我能够打印描述和bidAmount列的值,但用@Formula注释的字段,即shortDescription和averageBidAmount返回空值 有人能帮我指出这里的代码有什么问题吗 我正在Mac OSX上使用Hibernate 5.0、postgresql-9.3-1102-jdbc41和TestNG import java.math.BigDecimal; import java.util.List;
@Formula
注释是如何工作的
我能够打印描述和bidAmount列的值,但用@Formula注释的字段,即shortDescription和averageBidAmount返回空值
有人能帮我指出这里的代码有什么问题吗
我正在Mac OSX上使用Hibernate 5.0、postgresql-9.3-1102-jdbc41和TestNG
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;
}
}
编辑
我正在阅读《Hibernate第二版Java持久化》一书。
谢谢您的
DerivedProperty
实例是从持久性上下文返回的(从查询返回的结果集中只使用它们的ID)。这就是公式没有被评估的原因
如果不关闭实体管理器,则不会清除持久性上下文。提交第一个事务后,尝试添加
em.clear()
,以强制清除持久性上下文。Hack!!我不知道你们从哪里学到这些。我已经找了好几个小时了(
@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;
}
}