Java Hibernate通过工厂创建相关对象

Java Hibernate通过工厂创建相关对象,java,hibernate,persistence,Java,Hibernate,Persistence,我是Hibernate新手,我正在尝试实现以下目标:我使用的类是持久的,并且存储在DB中。看起来是这样的: class Card { private int id; private CardPrototype prototype; // fixed this line ... }; 并且具有持久性所需的所有getter、setter和注释。类卡存储在DB表中,如下所示 CREATE TABLE Card ( id SERIAL NOT NULL, prototype CH

我是Hibernate新手,我正在尝试实现以下目标:我使用的类是持久的,并且存储在DB中。看起来是这样的:

class Card {
  private int id;
  private CardPrototype prototype;  // fixed this line
  ...
};
并且具有持久性所需的所有getter、setter和注释。类卡存储在DB表中,如下所示

CREATE TABLE Card (
  id SERIAL NOT NULL,
  prototype CHAR(85) NOT NULL,
  ...
)
相关的类是CardPrototype,它由字符串标识符标识,并且根本不存储在数据库中。但是,我有一个带有非静态方法的工厂类

CardPrototype getPrototype (final String id)

我想在ORM对象加载期间使用它来解析Card.prototype字段。您能帮我用Hibernate实现这一点吗?

如果您正在使用批注,请尝试:

class Card {
  private int id;

  @ManyToOne
  private CardPrototype prototype;  // fixed this line
  ...

};

一个简单的解决方案是在您的Card类中有一个
字符串原型id
字段。然后使用
@PostLoad
在获得字符串id后从工厂检索对象

@PostLoad
public void loadCardProtoType() {
   CardPrototypeFactory factoryInstance = new CardPrototypeFactory();
   setCardPrototype(factoryInstance.getPrototype(this.prototypeId));
}

现在,当您使用Card类时,您将在其中包含CardPrototype实例。您还可以将
原型ID
作为一个私有字段。

您可以使用@Type注释并自行加载和保存。请参阅,尤其是UtcTimestampType的答案作为示例。

感谢您的想法。我使用这篇博客文章中的示例实现了从基于用户类型的字符串加载和映射CardPrototype的自定义类型是的,这是我想到的第一个想法,但实际上,我不想在我的类中有额外的字段,并且每次都与prototype同步if。嗨,谢谢你修复我的输入错误。问题是CardPrototype应该在数据库中,而不是。当使用它时,当Hibernate执行SQL连接不存在的表时会出现异常。