如何创建到没有主键的 SQL 表的映射?

Posted

技术标签:

【中文标题】如何创建到没有主键的 SQL 表的映射?【英文标题】:How to create a mapping to a SQL table that has no primary key? 【发布时间】:2020-11-13 03:50:00 【问题描述】:

我有一个没有主键的表。它需要一个 @ID 注释,如果没有它,将引发以下错误:

Caused by: org.hibernate.AnnotationException: No identifier specified for entity: 
overall.model.Overall
    at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:266) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:781) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]

我已经尝试在 JDBC 模板中实现以及使用 JPA,但我无法在没有 @ID 注释的情况下创建任何实体。

该表具有字符串类型的所有字段。您能否就如何将表配置为没有主键提出建议?

我正在使用spring-boot

【问题讨论】:

This 应该会有所帮助。 【参考方案1】:

由于表根本没有主键,请使用以下解决方法:创建一个 复合主键,由 所有 列组成。我希望他们不会太多。例如:

@Entity
@IdClass(UserNRole.InnerIdClass.class)
@Table(name = "users_n_roles")
public class UserNRole 
    @Id
    @Column(name = "user_id")
    private Integer userId;

    @Id
    @Column(name = "role_id")
    private Integer roleId;
 
    // getters, setters and constructor . . .
 
    public static class InnerIdClass implements Serializable 
        private Integer userId;
        private Integer roleId;
    

【讨论】:

以上是关于如何创建到没有主键的 SQL 表的映射?的主要内容,如果未能解决你的问题,请参考以下文章

映射到多个主键的外键列

维度建模:如何创建没有代理主键的表?

Sql 适配器。如何更新没有主键的 DataTable

sql怎么设置外键

如何正确映射与@IdClass 的多对一关系?

SQL Server 使用没有主键的聚集索引创建表