我有一个使用以下语法创建的表:
CREATE TABLE `Agreements` (
`Agreement_ID` int(30) NOT NULL AUTO_INCREMENT,
`Case_ID` int(11) NOT NULL,
KEY `fk_case_id` (`Case_ID`),
CONSTRAINT `fk_case_id` FOREIGN KEY (`Case_ID`) REFERENCES `cases` (`case_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
运行propel database:reverse
时,生成的架构如下所示:
<?xml version="1.0" encoding="utf-8"?>
<database name="xxx" defaultIdMethod="native" defaultPhpNamingMethod="underscore">
<table name="Agreements" idMethod="native" phpName="Agreements">
<column name="Agreement_ID" phpName="AgreementId" type="INTEGER" size="30" autoIncrement="true" required="true"/>
<column name="Case_ID" phpName="CaseId" type="INTEGER" required="true"/>
<foreign-key foreignTable="Cases" name="fk_case_id">
<reference local="Case_ID" foreign=""/>
</foreign-key>
<index name="fk_case_id">
<index-column name="Case_ID"/>
</index>
<vendor type="mysql">
<parameter name="Engine" value="InnoDB"/>
</vendor>
</table>
</database>
如您所见,foreign
元素的foreign-key
属性为空,这反过来又阻止了推进器根据此模式生成模型。
我有点被困在这里 - 任何帮助都会受到赞赏
答案 0 :(得分:0)
我发现了问题所在。对于我在Mac OS X上的上下文,并将MouseAdapter mouseHandler = new MouseAdapter() {
private Point offset;
private Racquet racquet;
@Override
public void mousePressed(MouseEvent e) {
// Did we click on a racquet?
if (racquet.getBounds().contains(e.getPoint())) {
// The difference between the mouse point and the original of the racquet
offset = new Point(e.getPoint().x - racquet.getBounds().x, e.getPoint().y - racquet.getBounds().y);
}
}
@Override
public void mouseDragged(MouseEvent e) {
// Are we dragging a racquet
if (offset != null) {
int newX = e.getPoint().x - offset.x;
int newY = e.getPoint().y - offset.y;
// This should be applied as a setting, but here we are
racquet.x = newX;
}
}
@Override
public void mouseReleased(MouseEvent e) {
// Release racquet
offset = null;
}
};
// The mouseHandler needs to be added to the primary rendering surface
// component.
addMouseListener(mouseHandler);
addMouseMotionListener(mouseHander);
设置为lower_case_table_names
。
正如您在我发布的DDL中所看到的,2
是小写字母,但在表格中定义为case_id
。 MySQL不会为这种差异而烦恼,但这会导致Propel逆向工程和模型生成代码失败,因为它无法在表定义中找到外键。
让我感到困惑的是,即使我手动更改DDL以匹配大小写,无论如何,如果我使用命令Case_ID
,MySQL仍然会生成小写版本的DDL。
似乎MySQL 8.x - 我在开发中使用的版本 - 呈现出这种奇怪的行为。在这一点上,这对我来说似乎是个错误。
我最终做的是降级到 5.7 并重新创建我的数据库。 MySQL 5.7保留了您提供的DDL的大小。这反过来又允许Propel做它的事情并成功更新模式以及生成模型。
如果有人知道为什么两个MySQL版本的行为不同,我很想知道原因。
这个问题现在已经解决了。 (虽然如果我们升级到8.x,我需要再次查看它)