2014-03-24 114 views
0

這裏的錯誤是我的jpaContext.xml:無法建立的EntityManagerFactory - 在表中加入

<?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: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/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="com.pluralsight"/> 

    <bean 
     class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"> 
    </bean> 
    <bean id="entityManagerFactory" 
     class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="punit"></property> 
    <property name="dataSource" ref="dataSource"></property> 
    <property name="jpaVendorAdapter"> 
     <bean 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="true"></property> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="hibernate.dialect" 
       value="org.hibernate.dialect.MySQL5InnoDBDialect"> 
      </entry> 
      <entry key="hibernate.hbm2ddl.auto" value="none"></entry> 
      <entry key="hibernate.format_sql" value="true"></entry> 
     </map> 
    </property> 
    </bean> 
    <bean id="transactionManager" 
     class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" 
      ref="entityManagerFactory"> 
     </property> 
    </bean> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" 
      value="com.microsoft.sqlserver.jdbc.SQLServerDriver"> 
     </property> 
     <property name="url" 
      value="jdbc:sqlserver://123.123.123.123:1433;databaseName=WikiGenome"> 
     </property> 
     <property name="username" value="xxx"></property> 
     <property name="password" value="xxx"></property> 
    </bean> 
</beans> 

這裏是我的Disease.java:

@Entity 
@Table(name="Disease") 
public class Disease { 
    @Id 
    @GeneratedValue 
    @Column(name="DiseaseID") 
    public int DiseaseID; 

    @Column(name="Name") 
    public String Name; 
} 

這裏是我的另一個類:

@Entity 
@Table(name="ChrPosDisease") 
public class ChrPosDisease implements Serializable{ 
    @Id 
    @Column(name="chr") 
    public String chr; 

    @Id 
    @Column(name="pos") 
    public int pos; 

    @Id 
    @Column(name="DiseaseID") 
    public int diseaseID; 
} 

我是ne w來休眠和彈簧mvc框架,我只是按照教程中的指導。 我可以利用查詢結果:

@SuppressWarnings({ "unchecked"}) 
    public List getDiseaseByName(String name) { 
     Query query = em.createQuery("Select d From Disease d Where d.Name=?1").setParameter(1,name); 
     List diseaseList=query.getResultList(); 
     return diseaseList; 
    } 

然而,當我通過DiseaseID連接兩個表,它提供了以下錯誤。

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [Select d From cuhk.cse.fyp.model.Disease d JOIN ChrPosDisease c Where d.DiseaseID=c.DiseaseID AND d.Name=?1] 

查詢結果只有一個表時沒有出錯。

這裏是我用來連接兩個表的代碼:

@SuppressWarnings({ "unchecked"}) 
    public List getJoinDiseaseByName(String name) { 
     Query query = em.createQuery("Select d From Disease d JOIN ChrPosDisease c Where d.DiseaseID=c.DiseaseID AND d.Name=?1").setParameter(1,name); 
     List diseaseList=query.getResultList(); 
     return diseaseList; 
    } 

有什麼不對?

感謝您的幫助。

補充: 更新ChrPosDisease

@SuppressWarnings("serial") 
@Entity 
@Table(name="ChrPosDisease") 
public class ChrPosDisease implements Serializable{ 
    @Id 
    @Column(name="chr") 
    public String chr; 

    @Id 
    @Column(name="pos") 
    public int pos; 

    @Column(name="DiseaseID") 
    public int diseaseID; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="DiseaseID",nullable=false) 
    private Disease disease; 
} 

更新疾病:

@SuppressWarnings("serial") 
@Entity 
@Table(name="Disease") 
public class Disease implements Serializable{ 
    @Id 
    @GeneratedValue 
    @Column(name="DiseaseID") 
    public int DiseaseID; 

    @Column(name="Name") 
    public String Name; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "ChrPosDisease") 
    private Set<ChrPosDisease> chrPosDisease = new HashSet<ChrPosDisease>(); 
} 

我用上述實體和有例外部署。

我需要添加其他東西嗎?

回答

0

我認爲你不應該使用d.ChrPosDisease,而應該只使用ChrPosDisease,因爲d是隻有Disease實體的別名。

它應該工作。

讓我知道它是否無效。

+0

你是指哪一個? 1.選擇d來自疾病d JOIN ChrPosDisease c其中d.DiseaseID = c.DiseaseID AND d.Name =?1 2.選擇d來自疾病d JOIN ChrPosDisease d其中d.Name =?1 – user3456617

+0

查詢查詢= em。createQuery(「Select d From Disease d JOIN d.ChrPosDisease c where d.DiseaseID = c.DiseaseID AND d.Name =?1」)。setParameter(1,name); –

+0

在上面的行只是看到你有d.ChrPosDisease,所以ChrPosDisease是一個表如何使用別名的表?刪除它,並嘗試讓我知道 –

0

你應該有映射條目爲:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "disease") 
private Set<ChrPosDisease> chrPosDisease = new HashSet<ChrPosDisease>(); 

mappedBy屬性通知該字段由特定的實體屬性映射。所以,這個屬性應該是連接實體在ManyToOne一側的那個屬性。

這裏Disease有很多ChrPosDisease。而ChrPosDisease有一個Disease。因此按列映射應該是OneToMany字段與ManyToOne一側的屬性綁定的字段。

+0

謝謝你的解釋! – user3456617