我使用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_id
, address_id
的复合PK .
Hibernate是错误的,还是我的JPA注释有问题?这是一种单向关联 .
正如一些人所指出的那样,从技术上讲,我不需要@OneToMany的连接表,但鉴于我需要在其他实体对象中使用Address实体,对我来说使用连接表更加清晰协会 .
我设法使用@ManyToMany关联破解解决方案并在连接列上指定唯一约束,但我试图了解我的JPA是否有问题或者是否是Hibernate错误 .
1 回答
如果联系人和地址之间需要一对多关系,其中一个联系人有多个地址 . 如果没有关联表,以下就足够了 .