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&lt;Carrier&gt; 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")