2017-01-16 17 views
0

私は空間データで春を使用するのにはかなり新しく、春の埋め込み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 
    } 
} 

を持っており、これは私が得る例外の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-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

私は上記のフィールドを削除しようと、それが働きました。

関連する問題