您好我第一次开始使用Spring和JPA,我已经在堆栈溢出处尝试了许多教程和问题。但没有成功,所以我希望有人可以给我一个明确的方法来解决这个问题。我正在开发一个玩具应用程序,以便在我开始真正的项目之前对该技术充满信心,我在尽可能使用Java注释的Maven-non web模块项目中使用Java,Spring,Hibernate,JPA和MySQL。尽可能小的xml,我发现很多web基础应用程序都是xml文件但是无法理解如何纠正我的项目。我唯一能理解的是,我需要声明一个持久性单元以某种方式告诉实体管理器该做什么,但我的项目中没有META-INF文件夹(应该创建一个?)和大多数persistance.xml文件我我发现声明的东西比我在jpa-handler-conf.xml中的声明要多得多,否则它似乎运行正常。 所以这是项目组件:
豆子:
package hp.esercizi.beans;
imports omitted...
@Component
@Entity
@Table(name = "AUTORE")
public class Autore {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name = "NOME", length = 20)
private String nome;
@Column(name = "COGNOME", length = 20)
private String cognome;
@OneToMany(targetEntity=Autore.class, mappedBy="amici")
private List<Autore> amici;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public List<Autore> getAmici() {
return amici;
}
public void setAmici(List<Autore> amici) {
this.amici = amici;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
}
package hp.esercizi.beans;
imports omitted...
@Component
@Entity
@Table(name = "MESSAGGIO")
public class Messaggio {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@Column(name = "TESTO", nullable = false, length = 200)
private String testo;
@ManyToOne
@JoinColumn(name="AUTORE_ID")
private Autore autore;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTesto() {
return testo;
}
public void setTesto(String testo) {
this.testo = testo;
}
public Autore getAutore() {
return autore;
}
public void setAutore(Autore autore) {
this.autore = autore;
}
}
DAOs:
package hp.esercizi.dao;
imports omitted...
public interface AutoreDAO {
public EntityManager getEntityManager();
public void setEntityManager(EntityManager entityManager);
public void insert(Autore autore);
public List<Autore> selectAll();
public Autore findAutoreByID(Long id);
}
package hp.esercizi.dao;
imports omitted...
@Repository("AutoreDAO")
@Transactional
public class AutoreDAOJPA2Impl implements AutoreDAO {
private static final String SELECT_QUERY = "select a from autore a";
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void insert(Autore autore) {
entityManager.persist(autore);
}
public List<Autore> selectAll() {
Query query = (Query) entityManager.createQuery(SELECT_QUERY);
List<Autore> autori = (List<Autore>) query.getResultList();
return autori;
}
public Autore findAutoreByID(Long id) {
return entityManager.find(Autore.class, id);
}
}
package hp.esercizi.dao;
imports omitted...
public interface MessaggioDAO {
public EntityManager getEntityManager();
public void setEntityManager(EntityManager entityManager);
public void insert(Messaggio messaggio);
public List<Messaggio> selectAll();
package hp.esercizi.dao;
imports omitted...
@Repository("MessaggioDAO")
@Transactional
public class MessaggioDAOJPA2Impl implements MessaggioDAO {
private static final String SELECT_QUERY = "select m from messaggio m";
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void insert(Messaggio messaggio) {
entityManager.persist(messaggio);
}
public List<Messaggio> selectAll() {
Query query = (Query) entityManager.createQuery(SELECT_QUERY);
List<Messaggio> messaggi = (List<Messaggio>) query.getResultList();
return messaggi;
}
}
实体管理器和数据源配置XML(jpa-handler-conf.xml):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.8.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="vendorAdaptor" />
<property name="packagesToScan" value="hp.esercizi" />
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create</prop>
</props>
</property>
</bean>
<bean id="abstractVendorAdaptor" abstract="true">
<!-- <property name="generateDdl" value="${db.generate}" /> -->
<property name="database" value="MYSQL" />
<property name="showSql" value="true" />
</bean>
<bean id="vendorAdaptor"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
parent="abstractVendorAdaptor">
</bean>
<bean id="entityManager"
class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/DB_SpringContext" />
<property name="username" value="root" />
<property name="password" value="Lavoro01" />
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<constructor-arg ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
</beans>
上下文配置:
package hp.esercizi.utility;
imports omitted...
@ComponentScan("hp.esercizi.beans")
public class BeansConfig {
}
package hp.esercizi.utility;
imports omitted...
@Configuration
@ComponentScan("hp.esercizi.dao")
public class DataSourceConfig {
}
package hp.esercizi.utility;
imports omitted...
@Configuration
@Import({BeansConfig.class , DataSourceConfig.class})
@ImportResource("jpa-handler-conf.xml")
public class SpringConfig {
}
主要:
package hp.esercizi.main;
imports omitted...
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory("AutoreDAO");
EntityManager entitymanager = emfactory.createEntityManager( );
entitymanager.getTransaction( ).begin( );
Messaggio msg = (Messaggio) context.getBean("messaggio");
entitymanager.merge(msg);
Autore aut = (Autore) context.getBean("autore");
entitymanager.merge(aut);
msg.setTesto("Ciao Mondo!!!");
aut.setNome("Mario");
aut.setCognome("Rossi");
System.out.println(msg.getTesto());
System.out.println(msg.getAutore().getNome() + " " + msg.getAutore().getCognome());
entitymanager.persist(msg);
entitymanager.getTransaction().commit();
Messaggio msg2 = entitymanager.find(Messaggio.class, 1);
ObjectMapper mapper = new ObjectMapper();
try {
System.out.println(mapper.writeValueAsString(msg2));
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
entitymanager.close( );
emfactory.close( );
}
}
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>esercizi</groupId>
<artifactId>SpringContext</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jpa</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.0.CR2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.0.CR2</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.8.5</version>
</dependency>
</dependencies>
</project>