2017-01-16 174 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

我试图消除上述领域和它的工作。

相关问题