ManyToOne和OneToMany时生成的键看起来错误

时间:2018-02-15 03:57:02

标签: postgresql jpa eclipselink one-to-many many-to-one

我有两个有关系的实体,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”列中的值违反了非空约束

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

最后我发现了这个问题。我有另一个实体,其TableName与ProfileEntity相同,但ID不同。该id包含不期望的user_id列。