Как я могу получить доступ к данным из двух баз данных в одном объекте, используя Hibernate? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь узнать, как я могу получить доступ к двум базам данных.Для этого я разработал проект, используя 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;
}

Это прекрасно работает, когда япозвони в ДАО.У меня есть два "hibernate.cfg" и два утилиты hibernate для подключения.

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

Я не знаю, должен ли я делать

личное фото списка

, или это другая проблема с режимом подключения, поскольку Photo.class отображается с помощью hibernate_base_arquivos.cfg.xml и Person.class с помощью hibernate.cfg.xml

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я решил это так:

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;
}

И вызову PhotoDao в PersonDAO.

0 голосов
/ 20 декабря 2018

Как то так?:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...