Eu sou muito novo no uso do spring com dados espaciais e estou tentando desenvolver um exemplo que faz uso do banco de dados H2 incorporado do spring com os dados espaciais. Eu tenho minhas classes de entidade e estou tentando criar uma classe de integração para testar minhas funções de serviço. Infelizmente, continuo recebendo essa mensagem de erro que não entendo. Assistência seria apreciada
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);
}
}
e a outra classe 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);
}
}
Eu tenho minha classe de teste de integração que estou tentando configurar e tenho este
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
}
}
e este é o rastreamento de pilha da exceção que recebo.
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)
não é uma declaração de coluna de banco de dados H2 válida. A declaração correta é LOCATION GEOMETRY
. Se você modificar a declaração do location
campo na Hotspot
classe para @Column(columnDefinition = "GEOMETRY")
, sua tabela deverá ser criada perfeitamente.
Também é importante notar que H2 não tem suporte embutido para tipos de dados espaciais. Você precisará do conjunto de topologia JTS no caminho de classe do aplicativo para poder usar colunas espaciais, conforme descrito na documentação vinculada.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras