如何在JPA中获得外键引用以具有“在删除级联时进行更新级联”功能?

时间:2019-05-09 05:15:03

标签: java mysql hibernate spring-boot spring-data-jpa

至少在过去的6个小时里,我一直在不停地胡闹,而我只是不明白问题是什么。我在SpringBoot项目中设置了两个类(User和Item),并且两个类之间存在双向关系,如下所示:

  • @OneToMany从用户到项目的关系(一个用户可以有多个项目)
  • @ManyToOne从项目到用户的关系(每个项目只有一个用户)

这是我的User类:

estimators[i].predict(X)

这是我的Item类(使用复合主键):

@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;

    ...
}

问题是由Hibernate创建的表(由SQL查询“ SHOW CREATE TABLE items”返​​回是这样的:

@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;
}

请注意,外键引用只是一个键,而不是一个外来键。下一个问题是它对更新或删除不执行任何操作,这是一个很大的问题。 我希望该表的外键显示为:

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

任何人都可以向我解释如何实现这一目标以及为什么我所拥有的无法正常工作吗?

1 个答案:

答案 0 :(得分:0)

已解决

@danblack告诉我,我需要将引擎更改为“ Innodb”。我是通过将spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect添加到我的application.properties文件中来实现的。

感谢@danblack!