我有两个有关系的实体,UserEntity:
@Embeddable
public class UserId extends EntityId implements Serializable {
@Column( length = CCEntity.ID_MAX_SIZE, name = ccIdCN )
private String ccId;
@Column( length = NAME_MAX_SIZE, name = userIdCN )
private String userId;
...
}
@Entity
@Table(name = TableNames.CC_Users)
public class UserEntity {
@EmbeddedId
private UserId id;
...
@OneToMany(targetEntity = ProfileEntity.class, mappedBy = "user", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE })
private List<ProfileEntity> profiles;
ProfileEntity:
@Embeddable
public class ProfileId extends EntityId implements Serializable {
@Column( length = CCEntity.ID_MAX_SIZE, name = ccIdCN )
private String ccId;
@Column( length = NAME_MAX_SIZE, name = profileIdCN )
private String profileId;
....
}
@Entity
@Table(name = TableNames.CC_Profile)
public class ProfileEntity {
@EmbeddedId
protected ProfileId id;
...
@ManyToOne
@JoinColumns(value = {
@JoinColumn( nullable = true, name = Columns.referenceIdCN, referencedColumnName = UserId.userIdCN ),
@JoinColumn( nullable = true, name = Columns.ccIdOfReferenceCN, referencedColumnName = UserId.ccIdCN ),
})
private UserEntity user;
当JPA创建表时,它会生成以下内容: 使用主键表CC_USER: cc_id,user_id 。那是正确的。 带有主键的表CC_PROFILE: cc_id,user_id,profile_id 。在这里,我不明白为什么JPA将 user_id 列添加为主键。该表还包含以下列: reference_id 和 cc_id_of_reference_id 设置为可为空。
我希望ProfileEntity的属性用户是可选的,或者是可空的。如果我尝试将用户的实体添加为null,我会得到:
内部异常:org.postgresql.util.PSQLException:错误:null “user_id”列中的值违反了非空约束
感谢您的帮助
答案 0 :(得分:0)
最后我发现了这个问题。我有另一个实体,其TableName与ProfileEntity相同,但ID不同。该id包含不期望的user_id列。