Hibernate 冬眠:“;实例化异常:无法实例化抽象类或接口;
我的班级结构如下:Hibernate 冬眠:“;实例化异常:无法实例化抽象类或接口;,hibernate,abstract-class,Hibernate,Abstract Class,我的班级结构如下: public class MailAccount{ IncomingMailServer incomingServer; OutgoingMailServer outgoingServer; } public class MailServer{ HostAddress hostAddress; Port port; } public class IncomingMailServer extends MailServer{ // ... } public cla
public class MailAccount{
IncomingMailServer incomingServer;
OutgoingMailServer outgoingServer;
}
public class MailServer{
HostAddress hostAddress;
Port port;
}
public class IncomingMailServer extends MailServer{
// ...
}
public class OutgoingMailServer extends MailServer{
// ...
}
public class ImapServer extends IncomingMailServer{
// ...
}
public class Pop3Server extends IncomingMailServer{
// ...
}
public class SmtpServer extends OutgoingMailServer{
// ...
}
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
我的(简化)映射文件如下所示:
<?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="com.mail.account">
<class name="MailAccount" table="MAILACCOUNTS" dynamic-update="true">
<id name="id" column="MAIL_ACCOUNT_ID">
<generator class="native" />
</id>
<component name="incomingServer">
<component name="hostAddress">
<property name="address" column="IS_HOST_ADDRESS"></property>
</component>
<component name="port">
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</component>
</component>
<component name="outgoingServer">
<component name="hostAddress">
<property name="address" column="OS_HOST_ADDRESS"></property>
</component>
<component name="port">
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</component>
</component>
</class>
</hibernate-mapping>
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
因此,我在incomingServer组件中添加了以下行:
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="ImapServer" extends="IncomingMailServer" discriminator-value="IMAP_SERVER" />
<subclass name="Pop3Server" extends="IncomingMailServer" discriminator-value="POP3_SERVER" />
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
显然,Hibernate不喜欢组件中的这些标记
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
我如何解决这个问题?
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
Ps:我已经尝试将IncomingServer和OutgoingServer分别移动到各自的表中,并通过一对一映射它们。这是可行的,但会导致数据库不一致,因为我注意到MailAccount和IncomingServer/OutgoingServer必须始终具有相同的主键id。否则,所有内容都将不同步,主键的自动增量值不再匹配(在MailAccount和服务器之间)。我的方法是:
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
- 创建一个实体(具有自己的映射)带有鉴别器和全部的MailServer。把它标成抽象的,只是为了确定
- 使用自己的鉴别器创建MailServer的层次结构(每个hbm一个)
- 将具有2个一对一关系的MailAccount映射到MailServer。一个传入,一个传出
请给我们看更多的代码。如果不知道,很难提供帮助:)这个映射对我很有用:
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
休眠映射
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
让我知道这是否解决了问题。:)
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
编辑:添加了从MailAccount到MailServer的映射。
<class name="MailServer" abstract="true" table="SERVER">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<subclass name="IncomingMailServer" abstract="true">
<property name="address" column="IS_HOST_ADDRESS"></property>
<property name="portNumber" column="IS_PORT_NUMBER"></property>
</subclass>
<subclass name="OutgoingMailServer" abstract="true">
<property name="address" column="OS_HOST_ADDRESS"></property>
<property name="portNumber" column="OS_PORT_NUMBER"></property>
</subclass>
</class>
<subclass name="IMAPServer" extends="com.mail.account.IncomingMailServer"
discriminator-value="IMAP_SERVER"/>
<subclass name="POP3Server" extends="com.mail.account.IncomingMailServer"
discriminator-value="POP3_SERVER"/>
<subclass name="SMTPServer" extends="com.mail.account.OutgoingMailServer"
discriminator-value="SMTP_SERVER" />
是的,但是如何在MailAccount和MailServer之间进行映射?我已经编辑了答案以添加映射;如果你有任何疑问,请告诉我。是的,这很有效。最后一个问题:为什么在这里使用多对一而不是一对一?好吧,我可以使用一对一但多对一,使用unique=true的方式也一样!谢谢你的接受,该死,我错过了赏金!!:-)正如我在最初的问题中所说的那样。一对一导致数据库不一致。这种情况是对单个表的一对一。您可以使用相同的id。是的,问题是两个id列都设置了自动增量标志。因此,每当“id”的下一个自动增量值在MailAccount id和MailServer id之间不同步时,一切都会变得一团糟。