java 如何在@ElementCollection上指定主键

7bsow1i6  于 2023-10-14  发布在  Java
关注(0)|答案(4)|浏览(123)

因此,如果某些表缺少主键,innodb的行为可能会导致问题。
因此,使用Hibernate,我正在寻找一个键来指定@ElementCollection表上的主键,该表以Set作为底层数据结构。
我发现了一种方法,可以用一个map来创建一个主键,但这有点奇怪,因为我不需要一个map。
我还找到了一个与@Embeddable相关的答案,但我不需要那种复杂性。我正在使用一个Set或Set作为实体中的数据结构。
有什么办法吗?

dy2hfwbg

dy2hfwbg1#

如果使用Set并使元素Column不为null,那么hibernate将为连接列和元素列创建一个主键。
范例:

@Column(name = "STRINGS", nullable = false)
@ElementCollection
private Set<String> strings;
g52tjvyc

g52tjvyc2#

@ElementCollection不能接受主键,因为Embeddable类型不能有标识符。
你可以add an @OrderColumn来优化生成的SQL语句。
如果你需要一个主键,那么你应该把@ElementCollection变成一个@OneToMany关联。

vnjpjtjt

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`)
)
oogrdqng

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<>();

相关问题