我正在尝试学习如何访问两个数据库。为此,我使用休眠模式开发了一个项目,并创建了两个这样的连接。
一个连接仅包含虚拟学生的数据,另一个包含身份证明照片。我想象一个包含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
映射答案 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。