ORM - 将休眠与内存数据混合

时间:2012-10-08 15:56:08

标签: java hibernate orm

我有两个java类,A& B,A持有对B的引用:

public class A {
   private long id;
   private B b;
   ...
}

public class B {
   private long id;
   ...
}

在我的数据库中,只存储A的实例,以及引用的B的ID:

$ select * from tableA;
id  | bid | ...
---------------
1   | 42  |
2   | 42  |
3   | 43  |
...

但是,B 存储在数据库中,但可以通过服务层ServiceB的某些实现来访问:

public interface ServiceB {
   public B getB(long bid);
}

如何使用Hibernate建模?我最好使用基于XML的HBM配置。我还想避免在A持有出价中添加一个瞬态字段(如果可能的话)。

3 个答案:

答案 0 :(得分:0)

介绍一个Repository并根据A& A建立一个新的对象。 B. Repository使用Hibernate检索A,使用服务检索B

答案 1 :(得分:0)

您需要开发一个新的org.hibernate.persister.entity.EntityPersister。这基本上就是Hibernate OGM(使用NoSQL支持的Hibernate + JPA)所做的,如果你需要一个如何实现它的参考。您将继续使用关系实体的标准持久性,并将自定义持久性用于非关系实体。

答案 2 :(得分:0)

我在此处发布了可供参考的解决方案。

您必须创建一个自定义休眠UserType,用于bid类中A字段的映射。在互联网上已经很好地解释了实施UserType,这不是重点。可以说nullSafeGet()操作通过从服务层加载相应的B将数据库id转换为B实例;而nullSafeSet()则反过来将B实例转换为它的内部id以存储到数据库。

根据所使用的注入框架(Guice,Spring,自定义解决方案......),可以通过多种方式将此自定义用户类型链接到服务层,但不应该是一个问题。

每个引用的类UserType都需要自定义B。对于从公共基类派生的几个引用类的情况,使用泛型可能是有用的,它可以作为练习留给读者。