因此,如果某些表缺少主键,innodb的行为可能会导致问题。因此,使用Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,该表以Set作为底层数据结构。我发现了一种方法,可以用一个map来创建一个主键,但这有点奇怪,因为我不需要一个map。我还找到了一个与@Embeddable相关的答案,但我不需要那种复杂性。我正在使用一个Set或Set作为实体中的数据结构。有什么办法吗?
dy2hfwbg1#
如果使用Set并使元素Column不为null,那么hibernate将为连接列和元素列创建一个主键。范例:
@Column(name = "STRINGS", nullable = false) @ElementCollection private Set<String> strings;
g52tjvyc2#
@ElementCollection不能接受主键,因为Embeddable类型不能有标识符。你可以add an @OrderColumn来优化生成的SQL语句。如果你需要一个主键,那么你应该把@ElementCollection变成一个@OneToMany关联。
@ElementCollection
Embeddable
@OrderColumn
@OneToMany
vnjpjtjt3#
在Sping Boot / Data JPA 2.5.2、hibernate-core 5.4.32上测试:
@Entity @Table(name = "user") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @Data @NoArgsConstructor public class User implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ElementCollection(fetch = FetchType.EAGER, targetClass = Role.class) @Enumerated(EnumType.STRING) @CollectionTable( name = "user_role", joinColumns = @JoinColumn(name = "user_id") ) @Column(name = "role", nullable = false) private Set<Role> roles; // public enum Role {ADMIN,USER} }
生成MySQL表:
CREATE TABLE `user_role` ( `user_id` bigint(20) NOT NULL, `role` varchar(255) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`user_id`,`role`), CONSTRAINT `FK_random_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) )
oogrdqng4#
这个例子是从一本书java持久化与Spring的数据和休眠,不工作的一套,但工程的java.util.收集.收集或列表@org.hibernate.annotations.GenericGenerator(name =“sequence_gen”,strategy =“sequence”)@org.hibernate.annotations.CollectionId(column = @Column(name =“NAME_ID”),type = @Type(type =“long”),generator =“sequence_gen”)@CollectionTable(schema =“",name =“NAMES”,joinColumns = @JoinColumn(name =“ROOT_ID”))@ElementCollection private List names = new ArrayList<>();
4条答案
按热度按时间dy2hfwbg1#
如果使用Set并使元素Column不为null,那么hibernate将为连接列和元素列创建一个主键。
范例:
g52tjvyc2#
@ElementCollection
不能接受主键,因为Embeddable
类型不能有标识符。你可以add an
@OrderColumn
来优化生成的SQL语句。如果你需要一个主键,那么你应该把
@ElementCollection
变成一个@OneToMany
关联。vnjpjtjt3#
在Sping Boot / Data JPA 2.5.2、hibernate-core 5.4.32上测试:
生成MySQL表:
oogrdqng4#
这个例子是从一本书java持久化与Spring的数据和休眠,不工作的一套,但工程的java.util.收集.收集或列表
@org.hibernate.annotations.GenericGenerator(name =“sequence_gen”,strategy =“sequence”)@org.hibernate.annotations.CollectionId(column = @Column(name =“NAME_ID”),type = @Type(type =“long”),generator =“sequence_gen”)@CollectionTable(schema =“",name =“NAMES”,joinColumns = @JoinColumn(name =“ROOT_ID”))@ElementCollection private List names = new ArrayList<>();