簡體   English   中英

如何在JPA中獲取外鍵引用以使“ON UPDATE CASCADE ON DELETE CASCADE”功能?

[英]How do I get a foreign key reference in JPA to have “ON UPDATE CASCADE ON DELETE CASCADE” functionality?

至少在過去的6個小時里,我一直在不停地愚弄,我只是無法理解問題所在。 我在SpringBoot項目(User和Item)中設置了兩個類,我在兩個類之間有雙向關系,如下所示:

  • @OneToMany從用戶到項目的關系(一個用戶可以有多個項目)
  • 從項目到用戶的@ManyToOne關系(每個項目只有一個用戶)

這是我的用戶類:

@Data
@Entity
@AllArgsConstructor
@Table(name="users")
public class User implements Serializable {   

    @Id
    private @NotNull String id;
    private @NotNull String username;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.owner", cascade = CascadeType.ALL)
    private List<Item> ownedItems;

    ...
}

這是我的Item類(使用復合主鍵):

@Data
@Entity
@AllArgsConstructor
@Table(name="items")
public class Item implements Serializable {


    @Data
    @Embeddable
    public static class PrimaryKey implements Serializable {

        private @NotNull String id;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(                
                name="user_id",
                referencedColumnName = "id",
                foreignKey = @ForeignKey(name = "FK_Item_UserID"),
                nullable = false,     // I have tried using these
                updatable = false,    // and excluding these and
                insertable = false    // that changes nothing
        )
        private @NotNull User owner;
    }


    @EmbeddedId
    private @NotNull PrimaryKey pk;

    private @NotNull String name, item_condition, categories;
    private @NotNull LocalDateTime postDate;
}

問題是由Hibernate創建的表(由SQL查詢'SHOW CREATE TABLE items'返回的是:

CREATE TABLE `items` (
  `id` varchar(255) NOT NULL,
  `categories` varchar(255) NOT NULL,
  `item_condition` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `post_date` datetime NOT NULL,
  `user_id` varchar(255) NOT NULL,
  PRIMARY KEY (`id`,`user_id`),
  KEY `FK_Item_UserID` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

請注意,外鍵引用只是一個KEY而不是FOREIGN KEY。 下一個問題是它在更新或刪除時沒有做任何事情,這是一個很大的問題。 我希望這個表的外鍵如下:

FOREIGN KEY ('user_id') REFERENCES Users('id') ON UPDATE CASCADE ON DELETE CASCADE

任何人都可以向我解釋如何實現這一目標以及為什么我的工作不起作用?

解決

@danblack告訴我,我需要將引擎改為“Innodb”。 我通過將spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect添加到我的application.properties文件中來完成此操作。

謝謝@danblack!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM