2010-04-16 43 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的实例 。请注意以下 错误:

我不知道这是否是唯一的错误。 希望这会帮助你。