2010-04-16 44 views
3

我剛開始使用Hibernate,我試圖將兩個座標之間的步行距離映射到HashMap中,可以有多個從「FromCoordinate」到另一個「ToCoordinate」的連接。我不知道我是否已經正確實施了這些,我需要哪些註釋來映射這個MashMap?謝謝使用註解映射Hibernate中的座標HashMap

HashMap> coordWalkingConnections = new HashMap>();

@Entity 
@Table(name = "COORDCONNECTIONS") 
public class CoordinateConnection implements Serializable{ 

    private static final long serialVersionUID = -1624745319005591573L; 

    /** auto increasing id number */ 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    @id 
    private int id; 

    @Embedded 
    public FromCoordinate fromCoord; 

    @Embedded 
    public ToCoordinate toCoord; 


HashMap<FromCoordinate, ArrayList<ToCoordinate >> coordWalkingConnections = new HashMap<FromCoordinate, ArrayList<ToCoordinate >>(); 

} 

public class FromCoordinate implements ICoordinate 
{ 
    @Column(name = "FROM_LAT") 
    private double latitude; 

    @Column(name = "FROM_LNG") 
    private double longitude; 
} 

public class ToCoordinate implements ICoordinate 
{ 

    @Column(name = "TO_LAT") 
    private double latitude; 

    @Column(name = "TO_LNG") 
    private double longitude; 

    @Column(name = "DISTANCE") 
    private double distance; 
} 

DATABASE STRUCTURE 
id FROM_LAT FROM_LNG TO_LAT  TO_LNG  Dist 
1 43.352669 -6.264341 43.350012 -6.260653 0.38 
2 43.352669 -6.264341 43.352669 -6.264341 0.00 
3 46.352669 -6.264341 43.353373 -6.262013 0.17 
4 47.352465 -6.265865 43.351290 -6.261200 0.25 
5 45.452578 -6.265768 43.352788 -6.264396 0.01 
6 45.452578 -6.265768 45.782788 -6.234523 0.01 
    ..... 
    ... 
    . 

Example HashMap for HashMap<Coordinate, ArrayList<Coordinate>> 


<KEY{43.352669 -6.264341}, Arraylist VALUES{(43.350012,-6.260653,0.383657), (43.352669, -6.264341, 0.000095), (43.353373, -6.262013, 0.173201)}> 
<KEY{47.352465 -6.265865}, Arraylist VALUES{(43.351290,-6.261200,0.258781)}> 
<KEY{45.452578 -6.265768}, Arraylist VALUES{(43.352788,-6.264396,0.013726),(45.782788,-6.234523,0.017726)}> 
+1

我不確定Hibernate是否可以將列映射到像這樣的列列表。如果這是一個更簡單的列到列映射,您可以使用@CollectionOfElements,@JoinTable和@MapKey。 – 2010-04-16 03:38:05

回答

0

那麼在我看來,你必須在初始化時使用接口類型的集合。

相反的:

HashMap<FromCoordinate, ArrayList<ToCoordinate >> coordWalkingConnections = new HashMap<FromCoordinate, ArrayList<ToCoordinate >>(); 

使用:

Map<FromCoordinate, List<ToCoordinate >> coordWalkingConnections = new HashMap<FromCoordinate, ArrayList<ToCoordinate >>(); 

如果你閱讀Hibernate文檔:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/collections.html你會讀到:

實際的接口可能是java.util中.Set,java.util.Collection, java.util.List,java.util.Map,java.util.SortedSet, java.util.SortedMap中或任何你喜歡(「任何你喜歡」的意思 你將不得不寫 org.hibernate.usertype.UserCollectionType的實現。)

通知實例變量是如何用一個實例初始化 HashSet。這是初始化新實例化(非永久)實例的收集值 屬性的最佳方法。當你通過調用persist()例如 使得實例持久化時,Hibernate實際上將HashSet替換爲Hibernate自己實現Set的實例 。請注意以下 錯誤:

我不知道這是否是唯一的錯誤。 希望這會幫助你。