2017-01-16 117 views
0

我對空間數據使用spring非常新,我試圖開發一個使用spring的嵌入式H2數據庫和空間數據的示例。 我有我的實體類,並試圖想出一個集成類來測試我的服務功能。 不幸的是,我不斷收到這個錯誤信息,我不明白。援助將不勝感激嵌入式h2數據庫未運行

package com.whot.domain; 

import javax.persistence.*; 
import java.io.Serializable; 

@Entity 
public class Address implements WhotEntity{ 

    @Id 
    @SequenceGenerator(name="addressIdSeq", sequenceName = "address_id_seq") 
    @GeneratedValue(strategy= GenerationType.AUTO, generator = "addressIdSeq") 
    private Long id; 
    @Column(name="street_name") 
    private String streetName; 
    private Long unit; 
    @Column(name = "street_number") 
    private Long number; 

    public Address(String streetName, Long unit, Long number) { 
     this.streetName = streetName; 
     this.unit = unit; 
     this.number = number; 
    } 

    public Address(String streetName, Long number){ 
     this(streetName, -1L, number); 
    } 

    public Address(){ 

    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getStreetName() { 
     return streetName; 
    } 

    public void setStreetName(String streetName) { 
     this.streetName = streetName; 
    } 

    public Long getUnit() { 
     return unit; 
    } 

    public void setUnit(Long unit) { 
     this.unit = unit; 
    } 

    public Long getNumber() { 
     return number; 
    } 

    public void setNumber(Long number) { 
     this.number = number; 
    } 

    public String toString(){ 
     return String.format("%s[id: %d]", getClass().getName(), id); 
    } 
} 

和其他類熱點

package com.whot.domain; 

import org.springframework.data.geo.Point; 

import javax.persistence.*; 

@Entity 
public class Hotspot implements WhotEntity{ 

    @Id 
    @SequenceGenerator(name="hotspotIdSeq", sequenceName = "hotspot_id_seq") 
    @GeneratedValue(strategy= GenerationType.AUTO, generator = "hotspotIdSeq") 
    private Long id; 
    private String name; 
    @OneToOne 
    @JoinColumn(name = "ADDR_ID") 
    private Address address; 
    @Column(columnDefinition = "geometry(Point, 4326)") 
    private Point location; 

    public Hotspot(String name, Address address, Point location) { 
     this.name = name; 
     this.address = address; 
     this.location = location; 
    } 

    public Hotspot() { 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Address getAddress() { 
     return address; 
    } 

    public void setAddress(Address address) { 
     this.address = address; 
    } 

    public Point getLocation() { 
     return location; 
    } 

    public void setLocation(Point location) { 
     this.location = location; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof Hotspot)) return false; 

     Hotspot hotspot = (Hotspot) o; 

     if (getId() != null ? !getId().equals(hotspot.getId()) : hotspot.getId() != null) return false; 
     if (getName() != null ? !getName().equals(hotspot.getName()) : hotspot.getName() != null) return false; 
     if (getAddress() != null ? !getAddress().equals(hotspot.getAddress()) : hotspot.getAddress() != null) 
      return false; 
     return getLocation() != null ? getLocation().equals(hotspot.getLocation()) : hotspot.getLocation() == null; 
    } 

    @Override 
    public int hashCode() { 
     int result = getId() != null ? getId().hashCode() : 0; 
     result = 31 * result + (getName() != null ? getName().hashCode() : 0); 
     result = 31 * result + (getLocation() != null ? getLocation().hashCode() : 0); 
     return result; 
    } 

    public String toString(){ 
     return String.format("%s[id: %d]", getClass().getName(), id); 
    } 
} 

我有我想設置我的集成測試類,我有這個

package com.whot.dao; 

import com.whot.domain.Address; 
import com.whot.domain.Hotspot; 
import com.whot.repository.AddressRepository; 
import com.whot.repository.HotspotRespository; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; 
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; 
import org.springframework.data.geo.Point; 
import org.springframework.test.context.ActiveProfiles; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.transaction.annotation.Transactional; 

import java.util.HashSet; 
import java.util.Iterator; 
import java.util.List; 

import static org.junit.Assert.assertNotNull; 
import static org.junit.Assert.assertTrue; 

/** 
* Created by Bart on 2017-01-07. 
*/ 
@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles("test") 
@DataJpaTest 
@Transactional 
public class HotspotRepositoryTest { 

    @Autowired 
    private HotspotRespository hotspotRepo; 

    @Autowired 
    private AddressRepository addressRepo; 

    @Autowired 
    private TestEntityManager em; 

    private HashSet<String> hotspotSet; 

    @Before 
    public void setUp(){ 
     hotspotSet = new HashSet<>(); 
     addressRepo.save(new Address("Ossiomo Street", -1L, 2L)); 
     addressRepo.save(new Address("Wilson Avenue", 103L, 2025L)); 
     addressRepo.save(new Address("Rue Clark", 303L, 2084L)); 
     addressRepo.save(new Address("Plateau Close", 20L, 40L)); 


    } 


    @Test 
    public void TestFindAllHotspots(){ 

     // some test code here 
    } 
} 

,這是我得到異常的堆棧跟蹤。

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE TABLE HOTSPOT (ID BIGINT GENERATED BY DEFAULT AS IDENTITY, LOCATION GEOMETRY(POINT[*], 4326), NAME VARCHAR(255), ADDR_ID BIGINT, PRIMARY KEY (ID)) "; expected "long"; SQL statement: 
create table hotspot (id bigint generated by default as identity, location geometry(Point, 4326), name varchar(255), addr_id bigint, primary key (id)) [42001-193] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.message.DbException.getSyntaxError(DbException.java:205) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.readLong(Parser.java:3094) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parseColumnWithType(Parser.java:4099) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parseColumnForTable(Parser.java:3938) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parseCreateTable(Parser.java:5977) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parseCreate(Parser.java:4238) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parsePrepared(Parser.java:362) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parse(Parser.java:317) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.parse(Parser.java:289) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.command.Parser.prepareCommand(Parser.java:254) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.engine.Session.prepareLocal(Session.java:561) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.engine.Session.prepareCommand(Session.java:502) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1203) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:170) ~[h2-1.4.193.jar:1.4.193] 
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158) ~[h2-1.4.193.jar:1.4.193] 
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54) ~[hibernate-core-5.2.5.Final.jar:5.2.5.Final] 
+0

您使用的是哪個版本的h2db? – Boldbayar

+0

較早的版本有一些問題https://github.com/h2database/h2database/issues/85 etc ... – Boldbayar

回答

1

LOCATION GEOMETRY(POINT[*], 4326)不是有效的H2數據庫列聲明。正確的聲明是LOCATION GEOMETRY。如果您將Hotspot類中的location字段的聲明更改爲@Column(columnDefinition = "GEOMETRY"),那麼您的表格應該被創建得很好。

還值得注意的是H2 does not have in-built support用於空間數據類型。您將需要應用程序類路徑上的JTS拓撲套件能夠使用空間列,如鏈接文檔中所述。

+0

我使用h2/geodb,並且從這個例子看起來效果不錯 https://github.com/ mstahv/spring-boot-spatial-example/blob/master/src/main/java/org/vaadin/example/SpatialEvent.java – legend

+0

請將您的列定義('@Column(columnDefinition = ...)')問題給我的答案和你鏈接的樣本。你會看到你的代碼不工作的原因。 – manish

+0

啊我的壞。謝謝您的幫助 – legend

0

我認爲問題是與以下領域:

@Column(columnDefinition = "geometry(Point, 4326)") 
    private Point location; 

不H2瞭解哪些數據類型不點應該被映射?

http://www.h2database.com/html/datatypes.html

我試圖消除上述領域和它的工作。

相關問題