- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 hibernate 生成 mysql 模式时遇到问题。我已经搜索了我的问题的答案,但我没有找到它(许多类似的问题,但不完全是我的)。
我需要将状态图映射到mysql(或转换表)中,并级联删除状态。一个国家可能有许多国家作为 child (多对多关系)。我成功地映射了 State 类和“下一个状态”关系,但没有在 DELETE CASCADE 上生成正确的 SQL 选项。
Java类如下:
public class State {
private Integer version;
private Integer oid;
private String name;
private Map<String, State> nextStates;
public State(String name) {
super();
this.name = name;
this.nextStates = new HashMap<String, State>();
}
/**
* Adds some state to the transitions table.
* The table is indexed by states names.
*
*/
public void addNextState(State s) {
this.nextStates.put(s.getName(), s);
}
(...)
hibernate 配置是:
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost/testStatesDB</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">pass</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
<property name="hibernate.bytecode.use_reflection_optimizer">false</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<mapping resource="State.hbm.xml" />
</session-factory>
</hibernate-configuration>
状态映射如下:
<hibernate-mapping>
<class name="State" table="state" optimistic-lock="version">
<id name="oid" column="OID">
<generator class="increment" />
</id>
<version column="version" name="version" unsaved-value="null"/>
<property name="name" type="java.lang.String"/>
<map name="nextStates" table="nextStates" cascade="delete" optimistic-lock="true">
<key column="parentState_oid" />
<index column="children_stateName" type="java.lang.String"/>
<many-to-many column="children_oid" class="State" />
</map>
</class>
</hibernate-mapping>
创建以下架构:
Hibernate:
create table nextStates (
parentState_oid integer not null,
children_oid integer not null,
children_stateName varchar(255) not null,
primary key (parentState_oid, children_stateName)
) ENGINE=InnoDB
Hibernate:
create table state (
OID integer not null,
version integer not null,
name varchar(255),
primary key (OID)
) ENGINE=InnoDB
Hibernate:
alter table nextStates
add index FKB4A102D5587BDC23 (parentState_oid),
add constraint FKB4A102D5587BDC23
foreign key (parentState_oid)
references state (OID)
Hibernate:
alter table nextStates
add index FKB4A102D5F71F7FB (children_oid),
add constraint FKB4A102D5F71F7FB
foreign key (children_oid)
references state (OID)
例如,考虑运行以下测试代码,
State pend = new State("Pending");
State dev = new State("In development");
State finali = new State("Finalized");
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
pend.addNextState(dev);
dev.addNextState(finali);
dev.addNextState(pend);
session.save(pend);
session.save(dev);
session.save(finali);
session.getTransaction().commit();
session.beginTransaction();
dev = (State)session.load(State.class, 3);
session.delete(dev);
session.getTransaction().commit();
我收到以下错误消息:
Cannot delete or update a parent row: a foreign key constraint fails (`testStatesDB`.`nextstates`, CONSTRAINT `FKB4A102D5F71F7FB` FOREIGN KEY (`children_oid`) REFERENCES `state` (`OID`))
如果我转到数据库并将属性 ON DELETE CASCADE 添加到生成的外键,该示例将按我的需要运行。
问题是:这是使用 HashMap 映射多对多关系的正确方法吗?如果它是正确的,我如何使用 hibernate xml 映射生成 ON DELETE CASCADE 选项?
这个问题困扰我很久了,一直没有找到好的解决办法。
最佳答案
我已经部分解决了这个问题:我在类 State 和 State 之间使用了双向关系(是的,递归关系有效)。在每个州中,我都有一张图中下一个州的 map ,以及父州的另一张 map 。
delete="cascade"选项没有像我希望的那样生成 ON DELETE CASCADE,但是,只要我保持状态内的集契约(Contract)步,我就可以级联删除。 “同步”的意思是,如果状态 S1 有 S2 作为下一个状态,那么如果你删除 S1 中的下一个状态 S2,你还必须让 S2 知道 S1 不再是它的父级。
我希望这对某人有所帮助...我被这个问题困扰了很长时间。
谢谢。伊格纳西奥
关于mysql - hibernate 不会在 mysql 中生成删除级联以映射 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12309969/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!