简体   繁体   English

嵌入式H2数据库未运行

[英]embedded h2 database not running

I am pretty new to using spring with spatial data and I am trying to develop an example that makes use of spring's embedded H2 database with and the spatial data. 我对将spring与空间数据结合使用还很陌生,我正在尝试开发一个示例,该示例利用spring的嵌入式H2数据库和空间数据。 I have my entity classes and am trying to come up with an integration class to test my service functions. 我有我的实体类,并试图提出一个集成类来测试我的服务功能。 Unfortunately, I keep getting this error message that I do not understand. 不幸的是,我一直收到我不明白的错误消息。 Assistance would be appreciated 协助将不胜感激

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);
    }
}

and the other class Hotspot 和另一类热点

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);
    }
}

I have my integration test class which I am trying to setup and I have this 我有要尝试设置的集成测试课程,我有这个

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
    }
}

and this is the stacktrace of the exception I get. 这是我得到的异常的堆栈跟踪。

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]

LOCATION GEOMETRY(POINT[*], 4326) is not a valid H2 database column declaration. LOCATION GEOMETRY(POINT[*], 4326)不是有效的H2数据库列声明。 The correct declaration is LOCATION GEOMETRY . 正确的声明是LOCATION GEOMETRY If you modify the declaration for the location field in Hotspot class to @Column(columnDefinition = "GEOMETRY") , your table should get created just fine. 如果将Hotspot类中的location字段的声明修改为@Column(columnDefinition = "GEOMETRY") ,则可以很好地创建表。

It is also worth noting that H2 does not have in-built support for spatial data types. 还值得注意的是,H2 没有对空间数据类型的内置支持 You will require the JTS topology suite on the application class path to be able to use spatial columns, as described in the linked documentation. 您将要求应用程序类路径上的JTS拓扑套件能够使用空间列,如链接文档中所述。

I think problem is with below field : 我认为问题在于以下领域:

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

Does H2 understand which data type does Point should be mapped ? H2是否了解Point应该映射哪种数据类型?

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

I tried removing the the above field and it worked. 我试图删除上述领域,它的工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM