Java 休眠正确映射映射

Java 休眠正确映射映射,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我在Hibernate中有以下几个类 @Entity @Table(name="MODEL") public class Model { @Id @GeneratedValue(generator="increment") @GenericGenerator(name="increment", strategy = "increment") Long id; @ElementCollection(fetch=FetchType.EAGER) @C

我在Hibernate中有以下几个类

@Entity
@Table(name="MODEL")
public class Model {

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment") 
    Long id;

  @ElementCollection(fetch=FetchType.EAGER)
    @CollectionTable
    (
        name="DEVICE_LiCENSE_ATTRIBUTE",
        joinColumns=@JoinColumn(name="DEVICE")
    )
    @MapKeyJoinColumn(name="LICENSE_ATTRIBUTE",nullable=false)
    Map<String,SoftwareLicense> softwareLicenses = new HashMap<String, SoftwareLicense>();

}
现在,当我运行Hibernate时,真正需要构建表

create table DEVICE_LiCENSE_ATTRIBUTE (DEVICE bigint not null, Type varchar(255) not null, VALUE varchar(255) not null, softwareLicenses_KEY varchar(255), primary key (DEVICE, softwareLicenses_KEY)) 

create table DMS_DEVICE_MODEL (id bigint not null, DESCRIPTION varchar(255) not null, DISPLAYNAME varchar(255) not null, UNIQUENAME varchar(255) not null, primary key (id), unique (UNIQUENAME)) 
我的问题发生在创建
设备\u许可证\u属性
表时

只需查看设备\许可证\属性表:

softwareLicenses\u KEY varchar(255)
可为空,Hibernate尝试在可为空的行上创建复合主键

primary key (DEVICE, softwareLicenses_KEY)
它在某些数据库(HSQLDB)上工作,但将代码切换到另一个环境(MSSQL2008)会给我带来一个错误

Cannot define PRIMARY KEY constraint on nullable column in table 'DEVICE_LICENSE_ATTRIBUTE'
我怎样才能解决这个问题

我的映射错误:

映射它的正确方法是使用映射列属性:

 @ElementCollection(fetch=FetchType.EAGER)
 @MapKeyColumn(name = "LICENSE_NAME", insertable = false, updatable = false) 
    @CollectionTable
    (
        name="DEVICE_LiCENSE_ATTRIBUTE",
        joinColumns=@JoinColumn(name="DEVICE")
    )
    @MapKeyJoinColumn(name="LICENSE_ATTRIBUTE",nullable=false)
    Map<String,SoftwareLicense> softwareLicenses = new HashMap<String, SoftwareLicense>();
@ElementCollection(fetch=FetchType.EAGER)
@MapKeyColumn(name=“LICENSE\u name”,insertable=false,updateable=false)
@收集表
(
name=“设备\许可证\属性”,
joinColumns=@JoinColumn(name=“DEVICE”)
)
@MapKeyJoinColumn(name=“LICENSE\u ATTRIBUTE”,nullable=false)
Map softwareLicenses=新建HashMap();
回家对某人有帮助

 @ElementCollection(fetch=FetchType.EAGER)
 @MapKeyColumn(name = "LICENSE_NAME", insertable = false, updatable = false) 
    @CollectionTable
    (
        name="DEVICE_LiCENSE_ATTRIBUTE",
        joinColumns=@JoinColumn(name="DEVICE")
    )
    @MapKeyJoinColumn(name="LICENSE_ATTRIBUTE",nullable=false)
    Map<String,SoftwareLicense> softwareLicenses = new HashMap<String, SoftwareLicense>();