我这里有两个一对一的关系,分别是类“MailAccount”和类“IncomingServer”以及类“OutgoingServer”之间的关系。
这是一个在Tomcat和Ubuntu服务器版上运行的Java应用程序。
映射如下所示:
MailAccount.hbm.xml
现在,这里出现了一个问题:
虽然我的应用程序大部分时间运行良好,但似乎有一种情况可以导致电子邮件服务器被删除,但相应的账户没有被删除,而在这种情况下就会发生以下调用:
在Hibernate中的一对一关系中,邮件账户和其服务器之间的主键必须相等,否则关系将完全失去同步:
例如:
想象一下,表中填充了以下数据:
表 "MailAccount" (当前自增值为2)
现在假设ID为1的账户被删除并添加了新的账户。接下来有时会发生以下情况:
表格"MailAccount"(当前自动增量值:3)
这会完全破坏我的数据库的一致性。我该如何避免这种情况?
这是一个在Tomcat和Ubuntu服务器版上运行的Java应用程序。
映射如下所示:
MailAccount.hbm.xml
<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>
<one-to-one name="incomingServer" cascade="all-delete-orphan">
</one-to-one>
<one-to-one name="outgoingServer" cascade="all-delete-orphan">
</one-to-one>
</class>
</hibernate-mapping>
IncomingMailServer.hbm.xml
<hibernate-mapping>
<class name="com.IncomingMailServer" table="MAILSERVER_INCOMING" abstract="true">
<id name="id" type="long" access="field">
<column name="MAIL_SERVER_ID" />
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<many-to-one name="mailAccount" column="MAIL_ACCOUNT_ID" not-null="true" unique="true" />
<subclass name="com.ImapServer" extends="com.IncomingMailServer" discriminator-value="IMAP_SERVER" />
<subclass name="com.Pop3Server" extends="com.IncomingMailServer" discriminator-value="POP3_SERVER" />
</class>
</hibernate-mapping>
OutgoingMailServer.hbm.xml
<hibernate-mapping>
<class name="com.OutgoingMailServer" table="MAILSERVER_OUTGOING" abstract="true">
<id name="id" type="long" access="field">
<column name="MAIL_SERVER_ID" />
<generator class="native" />
</id>
<discriminator column="SERVER_TYPE" type="string"/>
<many-to-one name="mailAccount" column="MAIL_ACCOUNT_ID" not-null="true" unique="true" />
<subclass name="com.SmtpServer" extends="com.OutgoingMailServer" discriminator-value="SMTP_SERVER" />
</class>
</hibernate-mapping>
类层次结构如下:
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{
// ...
}
现在,这里出现了一个问题:
虽然我的应用程序大部分时间运行良好,但似乎有一种情况可以导致电子邮件服务器被删除,但相应的账户没有被删除,而在这种情况下就会发生以下调用:
session.delete(mailAccountInstance);
在Hibernate中的一对一关系中,邮件账户和其服务器之间的主键必须相等,否则关系将完全失去同步:
例如:
想象一下,表中填充了以下数据:
表 "MailAccount" (当前自增值为2)
MAIL_ACCOUNT_ID NAME
0 Account1
1 Account2
表格"IncomingMailServer"(当前自增值为2)
MAIL_SERVER_ID MAIL_ACCOUNT_ID
0 0
1 1
现在假设ID为1的账户被删除并添加了新的账户。接下来有时会发生以下情况:
表格"MailAccount"(当前自动增量值:3)
MAIL_ACCOUNT_ID NAME
0 Account1
1 Account2
2 Account3
“IncomingMailServer”表(当前自动增量值为2)
MAIL_SERVER_ID MAIL_ACCOUNT_ID
0 0
1 2
这会完全破坏我的数据库的一致性。我该如何避免这种情况?