2013-12-03 6 views
0

Я создал веб-приложение GWT-Spring-Hibernate-JPA. Когда я использую только одну таблицу базы данных, она работает. Но когда я создал отношения «один ко многим», я вижу ошибку!GWT Spring Hibernate Jpa, Впрыскивание зависимых от автоподключения

 [WARN] Failed startup of context com.google.gwt.dev.shell.jetty.JettyLauncher$WebAppContextWi [email protected]{/,F:\Documents\desktop\WorkSpace\RssReader\war} 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'rssChanelDAO': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: javax.persistence.EntityManagerFactory com.javacodegeeks.server.dao.RssChanelDAO.entityManagerFacto ry; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Explicit persistence provider error(s) occurred for "MyPersistenceUnit" after trying the following discovered implementations: org.datanucleus.api.jpa.PersistenceProviderImpl, org.hibernate.ejb.HibernatePersistence from provider: org.hibernate.ejb.HibernatePersistence 

Я думаю, что что-то не так в файле persistence.xml или applicationContex.xml. Возможно, я ошибаюсь, чтобы использовать аннотации. Может быть, мне нужно использовать @ Controller?

Пожалуйста, помогите мне исправить их код.

applicationContex.xml

<beans > 

<context:component-scan base-package="com.javacodegeeks" /> 

<!-- pour les @Service 
     <context:include-filter type="annotation" 
      expression="org.springframework.stereotype.Service" /> 

     <context:exclude-filter type="annotation" 
      expression="org.springframework.stereotype.Controller" /> 
</context:component-scan>--> 
<tx:annotation-driven /> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="MyPersistenceUnit" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 
</beans> 

persistence.xml:

<persistence 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" 
version="2.0"> 

<persistence-unit name="MyPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 

    <properties> 
    <property name="hibernate.hbm2ddl.auto" value="update" /> 
    <property name="hibernate.show_sql" value="false" /> 
    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
    <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" /> 
    <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/User" /> 
    <property name="hibernate.connection.username" value="postgres" /> 
    <property name="hibernate.connection.password" value="1111" /> 

    <property name="hibernate.c3p0.min_size" value="5" /> 
    <property name="hibernate.c3p0.max_size" value="20" /> 
    <property name="hibernate.c3p0.timeout" value="300" /> 
    <property name="hibernate.c3p0.max_statements" value="50" /> 
    <property name="hibernate.c3p0.idle_test_period" value="3000" /> 

    </properties> 

</persistence-unit> 

</persistence> 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
       http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5" 
     xmlns="http://java.sun.com/xml/ns/javaee"> 

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 


    <listener> 
<listener-class> 
    org.springframework.web.context.ContextLoaderListener 
</listener-class> 
</listener> 
<servlet> 
<servlet-name>springGwtRemoteServiceServlet</servlet-name> 
<servlet-class>org.spring4gwt.server.SpringGwtRemoteServiceServlet 
</servlet-class> 

</servlet> 


<servlet-mapping> 

    <servlet-name>springGwtRemoteServiceServlet</servlet-name> 
<url-pattern>/gwtspringtestnomaven/springGwtServices/*</url-pattern> 

</servlet-mapping> 

    <!-- Default page to serve --> 
    <welcome-file-list> 
    <welcome-file>Gwtspringtestnomaven.html</welcome-file> 
    </welcome-file-list> 

</web-app> 

RssChanelDTO:

@Entity 
@Table(name = "RSS_CHANEL") 
public class RssChanelDTO implements java.io.Serializable { 

private static final long serialVersionUID = 7440297955003302414L; 

@Id 
@GeneratedValue(generator="increment") 
@GenericGenerator(name="increment", strategy = "increment") 
@Column(name="chanel_id") 
private long id; 

@Column(name="chanel_name", nullable = false, length=30) 
private String chanelName; 

@Column(name="chanel_url", nullable = false, length=30) 
private String chanelUrl; 

@OneToMany 
@JoinTable(name = "RSS_NEWS") 
Set<RssNewsDTO> news = new HashSet<RssNewsDTO>(); 

// setters, getters 

RssNewsDTO:

@Entity 
@Table(name = "RSS_NEWS") 
public class RssNewsDTO { 

    @Id 
    @GeneratedValue(generator="increment") 
    @GenericGenerator(name="increment", strategy = "increment") 
    @Column(name="news_id") 
    private Long id; 
    @Column(name="news_name", nullable = false, length=30) 
    private String newsName; 
    @Column(name="news_title", nullable = false, length=400) 
    private String title; 
    @Column(name="news_link", nullable = false, length=50) 
    private String link; 

    @ManyToOne 
    @JoinTable(name = "RSS_CHANEL") 
    private RssChanelDTO rssch; 

// getters , setters 

RssChanelDAO:

@Repository("rssChanelDAO") 
public class RssChanelDAO extends JpaDAO<Long, RssChanelDTO> { 

@Autowired 
EntityManagerFactory entityManagerFactory; 

@PostConstruct 
public void init() { 
    super.setEntityManagerFactory(entityManagerFactory); 
} 
    } 

RssNewsDAO:

@Repository("rssNewsDAO") 
public class RssNewsDAO extends JpaDAO<Long, RssNewsDTO> { 

@Autowired 
EntityManagerFactory entityManagerFactory; 

@PostConstruct 
public void init() { 
    super.setEntityManagerFactory(entityManagerFactory); 
} 

} 

RssChanelServiceImpl (аналогично RssNewsServiceImpl)

@Service("rssChanelService") 

public class RssChanelServiceImpl implements RssChanelService { 

@Autowired 
private RssChanelDAO rssChanelDAO; 

@PostConstruct 
public void init() throws Exception { 
} 

@PreDestroy 
public void destroy() { 
} 

public RssChanelDTO findRssChanel(long id) { 

    return rssChanelDAO.findById(id); 

} 

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 
public void saveRssChanel(String chanelName, String chanelUrl) throws Exception { 

    RssChanelDTO rssChanelDTO = new RssChanelDTO(chanelName,chanelUrl); 
    rssChanelDAO.persist(rssChanelDTO); 
    //.... 
} 

ответ

0

Ошибочные швы из-за некоторой проблемы сопоставления JPA. Я подумал, что, скорее всего, вы не хотите, но я не уверен, что это причина исключения.

В вашем отображении вполне вероятно, что вы хотите иметь двунаправленную связь между RssNewsDTO и RssChanelDTO (RssChanelDTO RssNewsDTO.rssch < ->Set<RssNewsDTO> RssChanelDTO.news). Но то, что вы отображаете, - это два разных, не связанных отношения, отношение 1: N и N: 1.

Если вы хотите, чтобы они были двунаправленная связь, то использовать это отображение:

@Entity 
@Table(name = "RSS_CHANEL") 
public class RssChanelDTO implements java.io.Serializable { 
    ... 

    @OneToMany(mappedBy="rssch") 
    Set<RssNewsDTO> news = new HashSet<RssNewsDTO>(); 
} 


@Entity 
@Table(name = "RSS_NEWS") 
public class RssNewsDTO { 
//try implements java.io.Serializable 
    ... 
    @ManyToOne 
    @JoinTable(name = "RSS_CHANEL") 
    private RssChanelDTO rssch; 
} 

Тогда RssNewsDTO.rssch является та сторона, которая controlles (сохранить) соотношение корабль. (RssChanelDTO.news более или менее) Только для чтения

+0

Что это такое? У меня есть ошибка, когда я меняю «имя» на «mappedBy». – BratchVV

+0

@BratchVV: это атрибут jpa для аннотации '@ OneToMay' http://en.wikibooks.org/wiki/Java_Persistence/OneToMany – Ralph

Смежные вопросы