2017-01-16 11 views
0

Я довольно новичок в использовании весны с пространственными данными, и я пытаюсь разработать пример, который использует встроенную базу данных H2 в Spring и пространственные данные. У меня есть классы сущностей, и я пытаюсь придумать класс интеграции для проверки моих сервисных функций. К сожалению, я продолжаю получать это сообщение об ошибке, которое я не понимаю. Помощь будет оцененавстроенная база данных 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); 
    } 
} 

и другие 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); 
    } 
} 

У меня есть интеграционный тест класс, который я пытаюсь установить и у меня есть этот

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

и это stacktrace исключения, которое я получаю.

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 и т. Д. – Boldbayar

ответ

1

LOCATION GEOMETRY(POINT[*], 4326) не является допустимым объявлением столбца базы данных H2. Правильная декларация - LOCATION GEOMETRY. Если вы измените объявление для поля location в классе Hotspot до @Column(columnDefinition = "GEOMETRY"), ваша таблица должна быть создана просто отлично.

Следует также отметить, что H2 does not have in-built support для пространственных типов данных. Для использования пространственных столбцов вам потребуется пакет топологии JTS на пути класса приложения, как описано в связанной документации.

+0

Я использую h2/geodb, и из этого примера, похоже, хорошо работает https://github.com/ mstahv/spring-boot-spaces-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

Я попытался удалить вышеуказанное поле, и она работала.