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

时间:2018-12-20 14:56:46

标签: java hibernate hibernate-mapping dao

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

一个连接仅包含虚拟学生的数据,另一个包含身份证明照片。我想象一个包含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”和两个hibernate util可以连接。

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字段有效时,当我调用Photo.class时它起作用了,但Person.class中没有照片。

我这样称呼:

Person person = personDAO.getPersonById(2);

我不知道是否应该做

  

私人列表照片

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

映射

2 个答案:

答案 0 :(得分:0)

是这样吗?:

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();

答案 1 :(得分:0)

我这样解决:

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。