我是Spring的新手,我正在尝试使用以下堆栈创建一个webapp:Apache Tomcat 7,MySQL,Spring MVC,带有JPA注释的Hibernate 3.
我正试图通过遵循Craig Walls的"Spring in Action,第三版"一书来学习.
首先,我想创建一个页面,显示我手动添加到我的数据库中的一些条目,但看起来我的应用程序无法从SessionFactory创建/检索任何Hibernate会话.这是我的根本原因堆栈跟踪:
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:656)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
com.nbarraille.www.dao.HibernateContactDAO.listContact(HibernateContactDAO.java:27)
com.nbarraille.www.controllers.HomeController.showHomePage(HomeController.java:24)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:613)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
Run Code Online (Sandbox Code Playgroud)
这是我关心的Classes/Config文件:
我的HibernateDAO:
@Repository
public …Run Code Online (Sandbox Code Playgroud) 我试图在eclipse中使用Jaxb类生成器从我的模式生成jaxb类.我收到以下错误:
"此项目的类路径似乎不包含继续生成类所需的库.请确保类路径上有JAXB实现."
我怎么解决这个问题?
我注意到我们的高级开发人员使用以下代码按ID检索实体:
@Override
public Source get(Long id) {
Session session = getSession();
if( session == null )
session = sessionFactory.openSession();
final Source source = (Source)session.load(Source.class, id);
Hibernate.initialize(source);
return source;
}
Run Code Online (Sandbox Code Playgroud)
这段代码有什么好处?
为什么不简单写作
return (Soruce) getSession().get(Source.class, id);
Run Code Online (Sandbox Code Playgroud) 我正在尝试定义一个CompositeUserType来处理我的JPA/Hibernate应用程序中的特定类型.我有一个名为ApplicationMessageType的CompositeUserType,用于处理我的映射.
根据我读过的内容,我应该能够在包含TypeDef的域层次结构中创建一个package-info.java类.我看起来像这样:
@TypeDefs({
@TypeDef(
defaultForType = ApplicationMessage.class,
typeClass = ApplicationMessageType.class
)
})
package mptstp.domain;
import mptstp.domain.messages.ApplicationMessage;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,我正在使用DefaultDeType参数到TypeDef这一事实,无论何时我尝试保存或加载ApplicationMessage,都应该调用自定义类型代码.
我已经在ApplicationMessageType类中的每个方法上设置了断点,并且没有一个 被调用.
有谁知道我哪里出错了?代码编译,但似乎从未调用TypeDef注释来注册ApplicationMessageType.
任何指针将不胜感激......
谢谢
我试图在OSGi中使用JPA并遇到这个异常:
javax.persistence.PersistenceException: No Persistence provider for EntityManager named test
Run Code Online (Sandbox Code Playgroud)
在META-INF中有简单的实体类,文件"persistence.xml":
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>org.test.Room</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/test"/>
<property name="javax.persistence.jdbc.password" value="12345"/>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="javax.persistence.jdbc.user" value="postgres"/>
</properties>
</persistence-unit>
</persistence>
Run Code Online (Sandbox Code Playgroud)
激活:
package org.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
private static BundleContext context;
static BundleContext getContext() {
return context;
}
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext; …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在@Query注释中使用子查询(org.springframework.data.jpa.repository.Query;)
我在第一个子查询parentesis上得到QuerySyntaxException.
这是我的查询
@Query(value="select c1 from ComplaintModel c1, "
+ "(select c2.id, min(cb.termDate) minDate from ComplaintModel c2 "
+ "join c2.complaintBullets cb join cb.status s where s.code = ?1 "
+ "group by c2.id) tmp where c1.id = tmp.id order by tmp.minDate")
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在测试一个返回json响应的控制器但是第一次测试失败,因为h2数据库没有重置自动增量id.手动使用夹具或创建对象也存在同样的问题.
@Before
public void setUp() {
Fixtures.deleteAllModels();
Fixtures.loadModels("data.yaml");
}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题呢?
基于axtavt的答案,这几乎肯定是Notebean和NoteBean之间的命名问题.这里有一个特定的惯例,只是正常的CamelCase吗?
我相信我已经更新了实体中的@NamedQuery注释,并且正在使用来自控制器的注释,并且名称看起来匹配,但我仍然收到关于模式的相同错误,我无法获得更多信息上.
JPA控制器:
package net.bounceme.dur.nntp.controller;
import java.util.*;
import java.util.logging.Logger;
import javax.mail.Message;
import javax.persistence.*;
import javax.swing.DefaultListModel;
import net.bounceme.dur.nntp.model.NoteBean;
public class NotesController {
private static final long serialVersionUID = 1L;
private static final Logger LOG = Logger.getLogger(NotesController.class.getName());
private Message message;
private List<NoteBean> notes = new ArrayList<NoteBean>();
private DefaultListModel defaultListModel = new DefaultListModel();
private EntityManagerFactory emf;
private EntityManager em;
private String PERSISTENCE_UNIT_NAME = "nntpPU";
public NotesController() {
emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
em = emf.createEntityManager();
LOG.info("entity manager made???" + em.isOpen());
populateList();
}
private void populateList() …Run Code Online (Sandbox Code Playgroud) 例如,在EclipseLink中使用@AdditionalCriteria很容易过滤掉软删除的实体,但有没有办法在执行特定查询之前暂时禁用它?
我偶然发现了一个非常烦人的情况:我使用Hibernate和Spring作为我的应用程序的后端,似乎在某些情况下,与特定实体关系的实体不会从DB获取为正常的实体对象,但作为Javassist类型.例如:
我的Campaign实体具有以下关系:
@Entity
@Table(name = "campaign")
public class Campaign implements Serializable {
[..]
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
"campaign_id", "dealer_id" }), name = "campaign_has_dealer", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "dealer_id", nullable = false) })
private List<Dealer> dealers = new ArrayList<Dealer>();
@ManyToMany
// (fetch = FetchType.LAZY)
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
"campaign_id", "sales_area_id" }), name = "campaign_has_sales_area", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns …Run Code Online (Sandbox Code Playgroud) java ×7
hibernate ×4
eclipselink ×2
jpql ×2
spring ×2
annotations ×1
eclipse ×1
h2 ×1
javassist ×1
jaxb ×1
jpa ×1
mysql ×1
orm ×1
osgi ×1
postgresql ×1
spring-data ×1
toplink ×1
typedef ×1