如何通过@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")
,但它不起作用,我得到了更多的错误。也许这很容易,有人可以帮助我在这里。
2条答案
按热度按时间uqcuzwp81#
这可能会解决您的问题。
LicenseKey
字符串
使用权
型
服务器
型
这将创建像这样的表结构
型
svmlkihl2#
问题的原因在于错误消息本身。
列“serverId”重复
由于
Server
类具有字段serverId
,JPA必须将该字段Map到数据库列serverId
。现在,第二个字段license
是Server
类中的一个单独字段,具有两个@JoinColumn
。这意味着它必须与其他两个列version
和serverId
匹配(重复)。这不可能吧?从代码中很难理解数据库的结构。你能不能也提供一个解决方案。
根据我的假设,您可以更改为
@Id private String id
或更改@JoinColumn
中的serverId
名称。