В настоящее время я пытаюсь заменить собственную реализацию контроллера базы данных на Hibernate, и у меня возникла следующая проблема при создании соответствующего файла сопоставления.
(я очень плохо знаком с Hibernate, поэтому, пожалуйста, будьте осторожны :-) -Я прочитал всю справочную документацию по Hibernate, но у меня пока нет практического опыта.)
(все это должно представлять связь между учетными записями электронной почты и настройками их сервера).
У меня есть класс с именем MailAccount, который имеет 2 свойства (см. Код ниже):
public class MailAccount{
long id;
IncomingMailServer incomingServer;
OutgoingMailServer outgoingServer;
public MailAccount(){
super();
}
// Getter and setter omitted
}
Иерархия класса сервера выглядит следующим образом:
MailServer.java
public abstract class MailServer {
String password;
String host;
String username;
String port;
// Getter and setter omitted
}
IncomingMailServer.java
public abstract class IncomingMailServer extends MailServer {
}
OutgoingMailServer.java
public abstract class OutgoingMailServer extends MailServer {
}
Pop3Server.java
public class Pop3Server extends IncomingMailServer{
public Pop3Server(){
super();
}
}
ImapServer.java
public class ImapServer extends IncomingMailServer{
public ImapServer(){
super();
}
}
SmtpServer.java
public class SmtpServer extends OutgoingMailServer{
public SmtpServer(){
super();
}
}
Свойствавходящий и исходящий сервер в MailAccount.java, конечно, толькохранить экземпляры Pop3Server, ImapServer (для входящегоServer) или SmtpServer (для outgoingServer).
Теперь я попытался создать файл сопоставления для MailAccount:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="test.account">
<class name="MailAccount" table="MAILACCOUNTS" dynamic-update="true">
<id name="id" column="MAIL_ACCOUNT_ID">
<generator class="native" />
</id>
<component name="incomingServer" class="test.server.incoming.IncomingMailServer">
<property name="password" column="INCOMING_SERVER_PASSWORD" />
<property name="host" column="INCOMING_SERVER_PASSWORD" />
<property name="username" column="INCOMING_SERVER_PASSWORD" />
<property name="port" column="INCOMING_SERVER_PASSWORD" />
</component>
<component name="outgoingServer" class="test.server.outgoing.OutgoingMailServer">
<property name="password" column="OUTGOING_SERVER_PASSWORD" />
<property name="host" column="OUTGOING_SERVER_PASSWORD" />
<property name="username" column="OUTGOING_SERVER_PASSWORD" />
<property name="port" column="OUTGOING_SERVER_PASSWORD" />
</component>
</class>
</hibernate-mapping>
Примечание: Поскольку я получил соотношение 1: 1 между MailAccount и IncomingMailServer, а также MailAccount и OutgoingMailServer, я хочу, чтобы все в 1 таблице было для предотвращения ненужных объединений.
Проблема: Всякий раз, когда я говорю Hibernate сохранить экземпляр MailAccount, например:
session = getSession();
transaction = session.beginTransaction();
session.save(mailAccount);
transaction.commit();
.. Я получаю следующее исключение:
org.hibernate.InstantiationException: Невозможно создать экземпляр абстрактного классаили интерфейс: test.server.incoming.IncomingMailServer
Это полностью имеет смысл, поскольку абстрактные классы не могут быть созданы.
Однако, здесь возникает мой вопрос : Какя могу сказать Hibernate создать экземпляр правильного класса (Pop3Server, SmtpServer, ImapServer) вместо абстрактных?
Пример: Если свойство входящийServer содержит экземпляр Pop3Server, то Hiberante должен сохранить его в моей базе данных, и когда я загружаю соответствующий MailAccount обратно, я хочу, чтобы Hibernate пересоздал экземпляр Pop3Server.