【问题标题】:Hibernate annotation onDelete not handed in shema export在shema导出中未提交Hibernate注释onDelete
【发布时间】:2014-12-23 15:10:35
【问题描述】:

我在使用 hibernate 4.3.5 注释时遇到问题。 我有一个项目,我使用注释和休眠 shema 导出来生成我的数据库。所有 JPA 注释都可以正常工作,并且数据库生成良好。 当我想添加一个休眠注释时,问题就来了:onDelete。 shema 导出忽略了这个注释,我找不到让它工作的方法。 我搜索了很多,发现了一些类似的主题,但没有一个能解决我的问题。

@Entity
@Table (name="comment")
public class Comment{
    ...
    @ManyToOne (fetch = FetchType.LAZY)
    @OnDelete (action=OnDeleteAction.CASCADE)
    @JoinColumn(name="from_user_id_comment")
    User fromUser;
    ...
}

我的关系是双向的。 (我在 User 类中有一个 cmets 列表)。

为创建表“comment”生成的 SQL 脚本如下:

Hibernate: 
    create table comment (
        ...
        from_user_id_comment integer,
        ...
        primary key (id_comment)
    )


Hibernate: 
    alter table comment 
        add constraint FK_7m60iklffdi8xx9m6tw8ci4w7 
        foreign key (from_user_id_comment) 
        references user (id_user)

我使用 maven 来处理我的依赖项。

我想让hibernate做的是生成带有约束的“ON DELETE CASCADE”,所以级联由DB处理。

有人可以帮帮我吗?

谢谢,

拍拍

pom.xml 依赖:

<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.2-1003-jdbc4</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.25</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.5.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.directory.studio</groupId>
        <artifactId>org.apache.commons.lang</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <version>4.3.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.14.8</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

【问题讨论】:

  • Hibernate 模式导出不会为 JPA 级联生成 SQL CASCADE DELETE。
  • 有办法吗?我的意思是不是手动
  • 您需要自定义架构导出。 AFAIK 这并不容易,我不会仅仅为了一个项目而这样做。我也不确定我是否希望在我的项目中将 JPA 级联转换为 SQL 级联。顺便说一句,可以在 ManyToOne 上指定级联,您不需要 OnDelete 注释。
  • 我只是设法让它工作。 Schema 导出可以生成 SQL CASCADE DELETES,但不能使用简单的 MySQLDialect。我不知道为什么。它用其他方言生成它们。
  • 好的,谢谢,很高兴知道。

标签: java hibernate jakarta-ee persistence


【解决方案1】:

我终于成功了。

休眠的 MySQLdialect(以及 MySQL5Dialect)不会将 @OnDelete 注释转换为“ON DELETE CASCADE”语句。我不知道为什么。

我的数据库是一个带有 InnoDB 引擎的 MySQL5 数据库。
我发现我可以使用 MySQL5InnoDBDialect,而且效果很好!

我所做的唯一更改是在 hibernate.cfg.xml 文件中的以下行:

<property name="dialect">
    org.hibernate.dialect.MySQL5InnoDBDialect
</property>

现在模式导出为我的 @OnDelete (action=OnDeleteAction.CASCADE) 注释生成 ON DELETE CASCADE 语句

Hibernate: 
    alter table comment 
        add constraint FK_7m60iklffdi8xx9m6tw8ci4w7 
        foreign key (from_user_id_comment) 
        references user (id_user)
        on delete cascade

对于 Hibernate 支持的其他方言,请参阅此页面:https://docs.jboss.org/hibernate/core/3.5/javadoc/org/hibernate/dialect/package-summary.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2013-01-18
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多