ORA-01400: 当使用 @onetomany 映射并且在子端具有复合主键时,无法将 NULL 插入
Posted
技术标签:
【中文标题】ORA-01400: 当使用 @onetomany 映射并且在子端具有复合主键时,无法将 NULL 插入【英文标题】:ORA-01400: cannot insert NULL into, when mapped with @onetomany and having composite primary key on child side 【发布时间】:2019-09-28 14:13:51 【问题描述】: 1. @OneToMany (Uni Direction):
Parent:
@Entity
@Table(name = "POLICY")
@SequenceGenerator(name = "SEQ_POLICY", sequenceName = "SEQ_POLICY", allocationSize = 1)
public class Policy implements Serializable
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_POLICY")
@Column(name = "POLICY_ID")
private BigDecimal policyID;
@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name = "POLICY_ID")
private List<Carrier> carriers = new ArrayList<>();
...
Child: (Having composite Primary key)
@Entity
@Table(name = "CARRIER")
public class Carrier implements Serializable
@EmbeddedId
private CarrierPK carrierPK;
...getters and setters
Child Primary key:
@Embeddable
public class CarrierPK implements Serializable
@Column(name="POLICY_ID")
private BigDecimal policyId;
@Column(name="TYPE_ID")
private BigDecimal typeId;
@Column(name="S_NUMBER")
private BigDecimal sNumber;
// getters and setter
// hashcode and equals
道代码:save方法的一部分
public class Bo
public void savePolicy()
List<Carrier> carriers = new ArrayList<>();
for(CarrierVo c:carriersList) //CarrierVo pojo from ui
// to copy properties form pojo to entity
Carrier cEntity = somecalss.method(c)
CarrierPK cPK = new CarrierPK();
cPK.setSNumber(c.getSNumber());
cPK.setTypeId(c.getTypeId());
cEntity.setCarriersPK(cPK);
carriers .add(cEntity);
policyEntity.setCarriers(carriers );
em.persist(policyEntity);
当我坚持时,我收到以下错误: 原因:java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("PROJECT"."CARRIER"."POLICY_ID")
我尝试使用@OneToMany 双向映射也得到了同样的错误。
【问题讨论】:
分享您的插入代码。 嗨@Rohit,我刚刚添加了持久化逻辑,请检查一次。 【参考方案1】:policyID 和运营商字段具有相同的名称 POLICY_ID。我认为在 JoinColumn 注释中将运营商列表映射为“POLICY_ID”inPolicy 实体是不正确的。也许必须有“CARRIER_ID”之类的东西或检查表描述该列应该是什么。尝试修复它。而且,如果运营商可以为空或为空,您可以添加 nullable=true
以进行 List<Carrier> carriers
映射。
【讨论】:
嗨,我已经重新验证了策略和运营商表,并且都有相同的列名 policy_id,运营商表中的 policy_id 是外键。是的,运营商可以为空,如果我想拥有此选项,那么我需要选择 OneTomany 双向,如果我没记错的话。 您在 Policy 表中有 2 个 POLICY_ID 列,我想,问题就在这里。对我来说,这是一个奇怪的设计,所以。如果policyId不是BigDecimal而是具有ManyToOne关系的Policy实体,您能否在CarrierPK中添加映射?如果不是,您可以先使运营商为空并保留政策,然后再 - 运营商列表。此外,您可以为 POLICY_ID 查找 jpa MapsId 注释:***.com/questions/58147161/…以上是关于ORA-01400: 当使用 @onetomany 映射并且在子端具有复合主键时,无法将 NULL 插入的主要内容,如果未能解决你的问题,请参考以下文章
从 mysql 迁移到 oracle 命中 ora-01400
oracle.jdbc.OracleDatabaseException:ORA-01400:无法将 NULL 插入
WHEN-BUTTON-PRESSED 触发器引发未处理的异常 ORA-01400
ORA-01400: 无法将 NULL 插入 ("repository name"."MD_PROJECTS"."ID")
goldengate OCI Error ORA-01400: cannot insert NULL into
我用的是oracle数据库,ORA-01400: 无法将 NULL 插入 ("SYSTEM"."PIZZA"."FACET")