我有两个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持有出价中添加一个瞬态字段(如果可能的话)。
答案 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
。对于从公共基类派生的几个引用类的情况,使用泛型可能是有用的,它可以作为练习留给读者。