我正在构建一个Web服务来为我正在构建的应用程序提供数据。因为我厌倦了SQL,所以我决定尝试一些不同的方法,经过一些实验决定neo4j。我已经有了一些实体课程,我们称之为A
,B
& C
。现在,为了将持久性与这些实体分开,我在数据库之上提供了一个抽象层。它允许我切换回SQL或类似于rethinkdb的完全不同的东西,如果neo4j最终严重缩放或其他什么。抽象层是一个名为DBAdaptor<MetaObject>
的接口,MetaObject
是一个类型变量。 NeoAdaptor<NeoMeta>
实现此接口就像假设的SQLAdaptor<SQLMeta>
一样。该界面提供了一系列方法,其中包括A,B和B。 C作为参数并返回此类型的对象,例如createA(some parameters):A<NeoMeta>
。 addAToB(A<NeoMeta> a, B<NeoMeta> b):void
。 ......
现在,A到C扩展了DBObject<MetaObject>
类,允许适配器将元数据关联到对象。在neo4j情况下,元对象将域级对象与内部节点ID相关联(不用担心,此ID是短暂的,不是公共API的一部分,因此在此上下文中重用节点ID是安全的)。整个想法是隐藏用户的这个元数据,这样他就可以处理A,B和C而不知道适配器添加了什么元数据(有点像装饰器)但java编译器显然警告我我正在使用原始类型。显然我并没有按照预期使用泛型类型。你怎么解决这个问题因为除了我的代码中的警告之外我发现这是一个相当优雅的解决方案。
一个小注意事项:我不打算能够同时运行两种不同的数据库类型,因此可以忽略在这种情况下发生的类转换异常。
答案 0 :(得分:0)
如果您要隐藏域类A
,B
或C
的用户的元数据,请不要让它们扩展DBObject<MetaObject>
,因为它会有相反的效果:将DBObject
接口暴露给用户。一般来说,让域类依赖于持久层是很糟糕的,因为持久层中的更改将会波及到这些类,并且您希望域更稳定。