ORA-01400: невозможно вставить NULL в при сопоставлении с @onetomany и наличии составного первичного ключа на дочерней стороне

            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


                }

Код Дао: часть метода сохранения

 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: невозможно вставить NULL в («PROJECT». «CARRIER». «POLICY_ID»)

Я попытался использовать двунаправленное сопоставление @OneToMany и получил ту же ошибку.


person Jyothsna    schedule 28.09.2019    source источник
comment
Поделитесь своим кодом вставки.   -  person Rohit    schedule 28.09.2019
comment
Привет @Rohit, я только что добавил логику сохранения, пожалуйста, проверьте один раз.   -  person Jyothsna    schedule 28.09.2019


Ответы (1)


Он имеет одинаковое имя POLICY_ID для полей policyID и перевозчиков. Я думаю, что неправильно сопоставлять список перевозчиков как объект «POLICY_ID» в политике в аннотации JoinColumn. Возможно, должно быть что-то вроде «CARRIER_ID» или описание таблицы проверки, каким должен быть столбец. Попробуйте исправить это. И, если возможно, что операторы связи могут быть нулевыми или пустыми, вы можете добавить nullable=true для сопоставления List<Carrier> carriers.

person mzherdev    schedule 28.09.2019
comment
привет, я повторно проверил и политику, и таблицу операторов, и оба имеют одинаковое имя столбца policy_id, policy_id в таблице операторов является внешним ключом. да, операторы связи могут иметь значение NULL. Если я хочу иметь эту опцию, мне нужно выбрать двунаправленный OneTomany, если я не ошибаюсь. - person Jyothsna; 29.09.2019
comment
У вас есть 2 столбца POLICY_ID в таблице Policy, я думал, проблема была здесь. Для меня это странный дизайн, т.к. Можете ли вы добавить сопоставление в CarrierPK для policyId, если это не объект BigDecimal, а Policy с отношением ManyToOne? Если нет, вы можете сначала сделать перевозчиков обнуляемыми и сохранить политику, а после этого - список перевозчиков. Кроме того, вы можете найти аннотацию jpa MapsId для POLICY_ID: -having-compo/58149538?noredirect=1#comment102687583_58149538" title="ora 01400 не может вставить null при сопоставлении с onetomany и наличии compo"> stackoverflow.com/questions/58147161/ - person mzherdev; 29.09.2019