Java 冬眠&;JPA:复合主键和外键中的同一字段会产生“0”;不允许在属性中混合可为null的列和不可为null的列;

Java 冬眠&;JPA:复合主键和外键中的同一字段会产生“0”;不允许在属性中混合可为null的列和不可为null的列;,java,spring,hibernate,jpa,composite-primary-key,Java,Spring,Hibernate,Jpa,Composite Primary Key,我有两张这样的桌子: CREATE TABLE TABLE_A ( [year] int NOT NULL, A_CODE int NOT NULL, CONSTRAINT PK_TABLE_A PRIMARY KEY ([year], A_PK) ); CREATE TABLE TABLE_B ( [year] int NOT NULL, B_CODE nvarchar(20) NOT NULL, A_CODE int NULL,

我有两张这样的桌子:

CREATE TABLE TABLE_A (
    [year] int NOT NULL,
    A_CODE int  NOT NULL,
    CONSTRAINT PK_TABLE_A PRIMARY KEY ([year], A_PK)
);


CREATE TABLE TABLE_B (
    [year] int NOT NULL,
    B_CODE nvarchar(20) NOT NULL,
    A_CODE int NULL,
    CONSTRAINT PK_TABLE_B PRIMARY KEY ([year], B_CODE),
    CONSTRAINT FK_TABLE_B FOREIGN KEY ([year],A_CODE) REFERENCES TABLE_A([year],A_CODE),
);
当表a行与表B有关系时(不是强制性的),FK由字段年份和字段a代码组成。YEAR也是表_B组合PK的成员。选择此解决方案是为了开发当前实体历史记录并保持当前表_a和当前表_B之间的现有关系

然后我运行hbm2java插件,该插件生成以下类:

表A ID:

@Embeddable
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
public class TableAId  implements java.io.Serializable
{
    public static final long serialVersionUID=1L;

    @Column(name="year", nullable=false)
    private Integer year;

    @Column(name="A_CODE ", nullable=false)
    private Integer a_code;
}
表A类别:

@Entity
@Table(name="TABLE_A"
)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
public class TableAe implements java.io.Serializable
{
    public static final long serialVersionUID=1L;

    @EmbeddedId
    @AttributeOverrides( {
            @AttributeOverride(name="year", column=@Column(name="year", nullable=false) ),
            @AttributeOverride(name="a_code", column=@Column(name="A_CODE", nullable=false) ) } )
    private TableAId id;

    @OneToMany(fetch=FetchType.LAZY, mappedBy="tableA")
    private Set<TableB> tableBs = new HashSet<TableB>(0);

}

表B类别:

@Entity
@Table(name="TABLE_B"
)
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
public class TableB implements java.io.Serializable
{

    public static final long serialVersionUID=1L;

    @EmbeddedId
    @AttributeOverrides( {
            @AttributeOverride(name="year", column=@Column(name="year", nullable=false) ),
            @AttributeOverride(name="b_code", column=@Column(name="B_CODE", nullable=false) ) } )
    private TableBId id;

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumns( {
            @JoinColumn(name="year", referencedColumnName="year", nullable=false, insertable=false, updatable=false),
            @JoinColumn(name="A_CODE", referencedColumnName="A_CODE", insertable=false, updatable=false) } )
    private TableA tableA;

}
运行应用程序时,堆栈跟踪生成以下消息:

AnnotationException: Mixing nullable and non nullable columns in a property is not allowed: TableB.tableA
但是,正如我所说,表A和表B之间的关系不是强制性的

AnnotationException: Mixing nullable and non nullable columns in a property is not allowed: TableB.tableA