首页 文章

JPA 2.0(Hibernate)使用@JoinTable为@OneToMany生成错误的连接表PK

提问于
浏览
1

我使用JPA 2.0与Hibernate 4.3.5并尝试使用Hibernate自动生成我的表 .

我在Contact实体中创建了以下条目:

/**
 * Address
 */
@Valid
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "contact_address", joinColumns = @JoinColumn(name = "contact_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id"))
@OrderColumn
private List<Address> addresses;

Hibernate正在创建联系表,但创建的连接表没有正确的PK:

CREATE TABLE `contact_address` (
  `contact_id` bigint(20) NOT NULL,
  `address_id` bigint(20) NOT NULL,
  `addresses_order` int(11) NOT NULL,
  PRIMARY KEY (`contact_id`),
  UNIQUE KEY `UK_mvvtppjfu6d0lcjm83u5youn8` (`address_id`),
  CONSTRAINT `FK_4fntyt0q2l6vkfg7t38pg4i94` FOREIGN KEY (`contact_id`) REFERENCES `contact` (`id`),
  CONSTRAINT `FK_mvvtppjfu6d0lcjm83u5youn8` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里列出的PK只是 contact_id ,这是不正确的 . 这将不允许我分配多个地址 . 相反,PK应该是 contact_idaddress_id 的复合PK .

Hibernate是错误的,还是我的JPA注释有问题?这是一种单向关联 .

正如一些人所指出的那样,从技术上讲,我不需要@OneToMany的连接表,但鉴于我需要在其他实体对象中使用Address实体,对我来说使用连接表更加清晰协会 .

我设法使用@ManyToMany关联破解解决方案并在连接列上指定唯一约束,但我试图了解我的JPA是否有问题或者是否是Hibernate错误 .

1 回答

  • 0

    如果联系人和地址之间需要一对多关系,其中一个联系人有多个地址 . 如果没有关联表,以下就足够了 .

    @Valid
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name="contact_id", referencedColumnName="id")
    private List<Address> addresses;
    

相关问题