2013-07-23 67 views
0

我有一个Person类用于保存数据。我在一个有逻辑的库中使用这个类。例如:计算人的出生年份。 这个库也可以创建新的人。Java注释和继承

在另一个使用上述库的项目中,我需要将Person类序列化到数据库中。我为此使用了第三方库。按照习惯,我可以在特定字段上放置自定义注释以便序列化它们。

所以我有一堆Person实例。我想将它们变成PersonAnonnatedDB实例。 PersonAnonnatedDB扩展Person,并且不添加新的方法或成员。 PersonAnonnatedDB确实已经添加了注释来告诉数据库如何将其序列化,但除此之外。

有没有什么办法可以从Person创建PersonAnonnatedDB而无需编写冗长而复杂的拷贝构造函数?

我不介意使用泛型注释来注释Person。我只是不想将数据库特定的注释添加到我的库项目中,因为我以后可能会使用其他数据库。

基本上,我想从我的持久层分离我的数据层,同时编写最小的胶水代码。

+0

我不知道我是否正确地跟着,所以这可能是完全无关你想要做什么,但看看'超级'关键字 –

+0

我不知道超级怎么会帮助我在这里。你不能从它的超类自动构造一个类实例。 Person是PersonAnonnatedDB的超类,所以虽然我可以很容易地从PersonAnonnatedDB构造一个Person,但我不能做相反的事情。 – eshalev

+0

啊我看到你想要的东西了。是的,超级不会帮助你。对此感到抱歉 –

回答

0

这样做的一种方法是将类Person扩展为PersonAnnotatedDB,其中类的一个成员是Person,一个成员是注释。 不会有重复的Person数据,只是对Person实例的引用。

那么这一切都取决于你想如何创建,使用或与原始人同步它们。

+0

为了正确序列化一个类,注解在它的'成员和方法中指定。我可以在外部PersonAnnotatedDB持有的内部Person类的字段中指定注释吗? – eshalev

+0

所以,如果我理解正确,您不想向Person添加注释,但只能添加到PersonAnnotatedDB。 – azzurroverde

+0

是的。我希望我的逻辑代码不会忘记Person可能存储在特定类型的数据库中。因此,帕森斯本身不能包含特定于数据库的注释。我可以通过一个接口实现这个功能:IPerson,但是我不能在算法代码中创建新的人员。基本上,我想从持久层去耦我的数据模型。 – eshalev

0

继承:绝对不能在“class?extends Person”中使用新注释修饰原始类的字段(它们是私人的,对吗?你甚至不能引用它们)。

你决定把该类放到哪里(某些应用程序,某些库等)是错误的。您必须将该类移至应用程序并正确装饰以实现持久性。

+0

是的,我猜到了。我不能把注释类放在我的核心逻辑中。我想支持至少两个(或更多)单独的持久性解决方案。如果我直接装饰模型,我将被迫将我的两个构建与每个解决方案链接起来。 – eshalev

+0

然后你正面临某种黑客攻击。 :/ Java不是为这种情况设计的。 – gyorgyabraham

2

执行此操作的一种方法是将Hibernate与xml mapping document一起使用。这将您的代码与持久性设置完全分开,并且不需要扩展Person对象。

+0

这看起来很有用,但我支持的主要数据库之一是:Amazon DynamoDB,它来自简短的Google搜索会话,不受休眠的支持。 – eshalev

+0

Amazon DynamoDB是NoSQL数据库。在Java应用程序和RDBMS之间以及在您的Java应用程序和Amazon DynamoDB之间移动数据的方式不会有类似的代码。因此,请保留您的域对象,使用Hibernate和XML映射与关系数据库进行交互,并使用其他代码与DynamoDB一起使用。 – Olaf