如何在JPA/Spring中@joincolumn key from table a with foreign key in table b

tag5nh1u  于 2023-08-02  发布在  Spring
关注(0)|答案(2)|浏览(112)

如何通过@joincolumn将表A中已有的键与表B中的字段链接。
详细地说,我有一个类服务器,它的关键字是serverId。它与由来自嵌入的Class LicenseKey的serverId链接的类许可证具有一对一的关系。现在的问题是,我的serverId已经被定义为ID,我得到了错误:
org.hibernate.MappingException:在实体“com.example.jpa.model.Server”的Map中,列“serverId”重复(将多个属性Map到同一列时,请使用“@Column(insertable=false,updatable=false)”)

import jakarta.persistence.*;

@Entity
@Table(name = "server")
public class Server {

@Id
private String serverId;

 @OneToOne
    @JoinColumn(name="version", referencedColumnName="version")
    @JoinColumn(name="serverId", referencedColumnName="serverId")
    private License license;
    
    // getter and setter    
}

@Entity
@Table(name = "license")
public class License {

    @EmbeddedId
    private LicenseKey id;
  // ...
}


@Embeddable
public class LicenseKey implements Serializable  {
    String version;
    String serverId;
 // ...
}

字符串
在那之后,我试图使用@JoinColumn(name="serverId", insertable=false, updateable=false, referencedColumnName="serverId"),但它不起作用,我得到了更多的错误。也许这很容易,有人可以帮助我在这里。

uqcuzwp8

uqcuzwp81#

这可能会解决您的问题。
LicenseKey

@Embeddable
@Getter
@Setter
public class LicenseKey implements Serializable {

   private Long l_server_id;

   //
}

字符串
使用权

@Entity
    @Getter
    @Setter
    public class License {
    
        @EmbeddedId
        private LicenseKey licenseKey;
    
        @OneToOne
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
        @MapsId("l_server_id")
        private Server server;
    
    }


服务器

@Entity
    @Getter
    @Setter
    public class Server {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long serverId;
    
        private String serverName;
    
            @OneToOne(cascade = CascadeType.ALL,mappedBy = "server",fetch = FetchType.EAGER)
        private License license;
    
    }


这将创建像这样的表结构

Hibernate: create table license (l_server_id bigint not null, primary key (l_server_id)) engine=InnoDB
Hibernate: create table server (server_id bigint not null auto_increment, server_name varchar(255), primary key (server_id)) engine=InnoDB
Hibernate: alter table license add constraint FKkope30d18c3etsmqjipi6yrw9 foreign key (l_server_id) references server (server_id)

svmlkihl

svmlkihl2#

问题的原因在于错误消息本身。
列“serverId”重复
由于Server类具有字段serverId,JPA必须将该字段Map到数据库列serverId。现在,第二个字段licenseServer类中的一个单独字段,具有两个@JoinColumn。这意味着它必须与其他两个列versionserverId匹配(重复)。这不可能吧?
从代码中很难理解数据库的结构。你能不能也提供一个解决方案。
根据我的假设,您可以更改为@Id private String id或更改@JoinColumn中的serverId名称。

相关问题