I am currently trying to match my Java class hierarchy in my database using Hibernate, but I continue to discard the following (subclass) of classes:
I have a MailAccount class that has 3 properties (see code below):
public class MailAccount{
long id;
IncomingMailServer incomingServer;
OutgoingMailServer outgoingServer;
public MailAccount(){
super();
}
}
The server class hierarchy is as follows:
MailServer.java
public abstract class MailServer {
String password;
String host;
String username;
String port;
}
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();
}
}
The properties of the incomingServer and the outgoing server in MailAccount.java, of course, contain only instances of Pop3Server, ImapServer (for the incoming server) or SmtpServer (for the outgoing server).
I use the following display configuration:
MailAccount.hbm.xml
<hibernate-mapping package="test.account">
<class name="MailAccount" table="MAILACCOUNTS" dynamic-update="true">
<id name="id" column="MAIL_ACCOUNT_ID">
<generator class="native" />
</id>
<one-to-one name="incomingServer" cascade="all">
</one-to-one>
<one-to-one name="outgoingServer" cascade="all">
</one-to-one>
</class>
</hibernate-mapping>
MailServer.hbm.xml
<hibernate-mapping>
<class name="test.server.MailServer" table="MAILSERVER" abstract="true">
<id name="id" type="long" access="field">
<column name="MAIL_SERVER_ID" />
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<property name="password" column="PASSWORD" />
<property name="host" column="HOST" />
<property name="username" column="USERNAME" />
<property name="port" column="PORT" />
<one-to-one name="mailAccount" class="test.account.MailAccount" foreign-key="MAIL_SERVER_ID"></one-to-one>
<subclass name="test.server.incoming.ImapServer" extends="test.server.incoming.IncomingMailServer" discriminator-value="IMAP_SERVER">
</subclass>
<subclass name="test.server.incoming.Pop3Server" extends="test.server.incoming.IncomingMailServer" discriminator-value="POP3_SERVER">
</subclass>
<subclass name="test.server.outgoing.SmtpServer" extends="test.server.outgoing.OutgoingMailServer" discriminator-value="SMTP_SERVER">
</subclass>
<subclass name="test.server.incoming.IncomingMailServer" extends="test.server.MailServer" abstract="true" discriminator-value="INCOMING_SERVER">
</subclass>
<subclass name="test.server.outgoing.OutgoingMailServer" extends="test.server.MailServer" abstract="true" discriminator-value="OUTGOING_SERVER">
</subclass>
</class>
</hibernate-mapping>
: , Hibernate MailAccount, :
session = getSession();
transaction = session.beginTransaction();
session.save(mailAccount);
transaction.commit();
.. Hibernate EXCEPT SERVER_TYPE MailServer.
Hibernate "IMAP_SERVER", "POP3_SERVER", "SMTP_SERVER", "INCOMING_SERVER" "OUTGOING_SERVER".
, (), Hibernate "IncomingMailServer" "OutgoingMailServer", .
, Hibernate ?
: incomingServer Pop3Server, Hiberante , MailAccount, , Hibernate Pop3Server.
: Hibernate, , , , :-). , .hmb.xml , , , : -)