How to keep the correct discriminator value through Hibernate

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

    // Getter and setter omitted
}

The server class hierarchy is as follows:

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

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 , , , : -)

+3
1

<subclass> :

<subclass name="test.server.incoming.IncomingMailServer" extends="test.server.MailServer" abstract="true" discriminator-value="INCOMING_SERVER">
    <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>

<subclass name="test.server.outgoing.OutgoingMailServer" extends="test.server.MailServer" abstract="true" discriminator-value="OUTGOING_SERVER">
    <subclass name="test.server.outgoing.SmtpServer" extends="test.server.outgoing.OutgoingMailServer" discriminator-value="SMTP_SERVER">
    </subclass>
</subclass>
+2

All Articles