如何使用 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。
我正在尝试了解如何访问两个数据库。为此,我使用 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。