如何使用 Hibernate 在单个实体中访问来自两个数据库的数据?

How can I access data from two databases, in a single entity, using Hibernate?

我正在尝试了解如何访问两个数据库。为此,我使用 hibernate 开发了一个项目,并创建了两个这样的连接。

一个连接只包含一个虚构学生的数据,另一个包含一张身份证照片。我想象一个包含 PDF、图像的文件数据库...

图片有一个复合主键,因为它被分成多行字节。

我可以在每个底座上单独连接,但是当我尝试同时使用它们时我不能。

Photo.class

@IdClass(PhotoId.class)
public class Photo {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id_arquivo")
   private int idArquivo;

   @Id
   @Column(name = "item", nullable = false)
   private long item;

   @Column(name = "conteudo", nullable = false)
   private byte[] conteudo;

   @Column(name = "size", nullable = false)
   private long size;
...
}

class PhotoId implements Serializable {
   private static final long serialVersionUID = 1L;

   private int idArquivo;
   private long item;
...
}

Person.class

public class Person {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id_pessoa")
   private int idPessoa;

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "id_arquivo_foto", referencedColumnName = "id_arquivo")
   private Photo photo;
}

这在我调用 DAO 时非常有效。 我有两个 "hibernate.cfg" 和两个休眠工具要连接。

PersonDAO.class

public class PersonDAO{
   private static PersonDAO personDAOInstance;

   public static PersonDAO getInstance(){
       if(personDAOInstance == null) {
           personDAOInstance = new PersonDAO();
       }
       return(personDAOInstance);
   }

   public Person getPersonById(int id){
       Session session = HibernateUtil.getSessionFactory().openSession();
       Person person = null;

       try {
           Query consulta = session.getNamedQuery("Person.buscarPorId");
           consulta.setInteger("id", id);

           person = (Person) consulta.uniqueResult();
       } catch(RuntimeException ex) {
           throw ex;
       } finally {
           session.close();
       }

       return(person);
   }
}

我有另一个 DAO 只是为了照片,PhotoDAO.class 与 PersonDAO.class 相同,只是进行了必要的映射更改。 我调用该对象,它总是出错,但是当我在 Person.class 中评论照片字段时,当我调用 Photo.class 时它起作用,但从来没有 Person.class 和照片。

我这样称呼它:

Person person = personDAO.getPersonById(2);

不知道该不该做

private List photo

,或者是连接模式的另一个问题,因为 Photo.class 被 hibernate_base_arquivos.cfg.xml 映射, Person.class 被 hibernate.cfg.xml

映射

是这样的吗?:

Configuration cfg1 = new AnnotationConfiguration();
cfg1.configure("/hibernate-oracle.cfg.xml");
cfg1.addAnnotatedClass(SomeClass.class); // mapped classes
cfg1.addAnnotatedClass(SomeOtherClass.class);
SessionFactory sf1 = cfg1.buildSessionFactory();

Configuration cfg2 = new AnnotationConfiguration();
cfg2.configure("/hibernate-mysql.cfg.xml");
cfg2.addAnnotatedClass(SomeClass.class); // could be the same or different than above
cfg2.addAnnotatedClass(SomeOtherClass.class);
SessionFactory sf2 = cfg2.buildSessionFactory();

我是这样解决的:

Before
public class Person {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id_pessoa")
   private int idPessoa;

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "id_arquivo_foto", referencedColumnName = "id_arquivo")
   private Photo photo;
}

After
public class Person {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   @Column(name = "id_pessoa")
   private int idPessoa;

   @Column(name="id_arquivo_foto")
   private Long photoId;

   @Transient
   private Photo photo;
}

并在 PersonDAO 中调用 PhotoDao。