1

我有两个 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 持有出价中添加一个临时字段(如果可能的话)。

4

3 回答 3

0

引入 aRepository并基于 A & B 构建一个新的 Object。Repository使用 HibernateA检索和使用 Service 检索B

于 2012-10-08T16:01:55.670 回答
0

我在此处发布找到的解决方案以供参考。

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

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

您需要UserType为每个引用的类自定义B。在从公共基类派生的多个引用类的情况下,使用泛型可能很有用,它留给读者作为练习。

于 2012-10-15T07:56:49.930 回答
0

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

于 2012-10-08T19:39:52.547 回答