Mohamed Nagy
Mohamed Nagy

Reputation: 176

Foreign key is showing null while inserting into Child Table, error Cannot insert the value NULL into column

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert the value NULL into column 'WHITE_LIST_UID', table 'ECM3.dbo.WHITE_LIST_MATCHESII'; column does not allow nulls. INSERT fails.

I have done many searches for my problem and I have tried every possible solution but it's not working. I'm trying to insert into child table (WhiteListMatches) using parent table(WhiteList) with relation oneToMany, but it shows the previous error!

WhiteList.java (parent)

 import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    import javax.persistence.Basic;
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;

    @Entity
    @Table(name = "WHITE_LISTII")
    public class WhiteList implements Serializable {

        @Id
        @Column(name = "WHITE_LIST_UID")
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private Integer whiteListUid;

        @Basic(optional = false)
        @Column(name = "ENTITY_NAME")
        private String entityName;

        @OneToMany(cascade = CascadeType.ALL,mappedBy = "whiteList")
        private List<WhiteListMatches> matches = new ArrayList<>();

        public WhiteList() {
        }

        public WhiteList(Integer whiteListUid) {
            this.whiteListUid = whiteListUid;
        }

        public WhiteList(Integer whiteListUid, String entityName) {
            this.whiteListUid = whiteListUid;
            this.entityName = entityName;
        }

        public Integer getWhiteListUid() {
            return whiteListUid;
        }

        public void setWhiteListUid(Integer whiteListUid) {
            this.whiteListUid = whiteListUid;
        }

        public String getEntityName() {
            return entityName;
        }

        public void setEntityName(String entityName) {
            this.entityName = entityName;
        }

        public List<WhiteListMatches> getMatches() {
            return matches;
        }

        public void setMatches(List<WhiteListMatches> matches) {
            this.matches = matches;
        }        

        @Override
        public int hashCode() {
            int hash = 0;
            hash += (whiteListUid != null ? whiteListUid.hashCode() : 0);
            return hash;
        }

        @Override
        public boolean equals(Object object) {
            // TODO: Warning - this method won't work in the case the id fields are not set
            if (!(object instanceof WhiteList)) {
                return false;
            }
            WhiteList other = (WhiteList) object;
            if ((this.whiteListUid == null && other.whiteListUid != null) || (this.whiteListUid != null && !this.whiteListUid.equals(other.whiteListUid))) {
                return false;
            }
            return true;
        }

        @Override
        public String toString() {
            return "com.model.datagear.entity.WhiteList[ whiteListUid=" + whiteListUid + " ]";
        }

    }

WhiteListMatches.java (child)

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "WHITE_LIST_MATCHESII")
public class WhiteListMatches implements Serializable {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "MATCH_ENTITY_NAME")
    private String matchEntityName;

    @Column(name = "MATCH_ENTITY_ADDRESS")
    private String matchEntityAddress;

    @Column(name = "MATCH_ENTITY_YEAR_OF_BIRTH")
    private String matchEntityYearOfBirth;

    @Column(name = "MATCH_ENTITY_DATE_OF_BIRTH")
    private String matchEntityDateOfBirth;

    @Column(name = "MATCH_ENTITY_PLACE_OF_BIRTH")
    private String matchEntityPlaceOfBirth;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "WHITE_LIST_UID", nullable = false)
    private WhiteList whiteList;

    public WhiteListMatches() {
    }

    public WhiteListMatches(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getMatchEntityName() {
        return matchEntityName;
    }

    public void setMatchEntityName(String matchEntityName) {
        this.matchEntityName = matchEntityName;
    }

    public String getMatchEntityAddress() {
        return matchEntityAddress;
    }

    public void setMatchEntityAddress(String matchEntityAddress) {
        this.matchEntityAddress = matchEntityAddress;
    }

    public String getMatchEntityYearOfBirth() {
        return matchEntityYearOfBirth;
    }

    public void setMatchEntityYearOfBirth(String matchEntityYearOfBirth) {
        this.matchEntityYearOfBirth = matchEntityYearOfBirth;
    }

    public String getMatchEntityDateOfBirth() {
        return matchEntityDateOfBirth;
    }

    public void setMatchEntityDateOfBirth(String matchEntityDateOfBirth) {
        this.matchEntityDateOfBirth = matchEntityDateOfBirth;
    }

    public String getMatchEntityPlaceOfBirth() {
        return matchEntityPlaceOfBirth;
    }

    public void setMatchEntityPlaceOfBirth(String matchEntityPlaceOfBirth) {
        this.matchEntityPlaceOfBirth = matchEntityPlaceOfBirth;
    }

    public WhiteList getWhiteList() {
        return whiteList;
    }

    public void setWhiteList(WhiteList whiteList) {
        this.whiteList = whiteList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof WhiteListMatches)) {
            return false;
        }
        WhiteListMatches other = (WhiteListMatches) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.model.datagear.entity.WhiteListMatches[ id=" + id + " ]";
    }

}

insert method

public void inertIntoWhiteList(String entityName, Set<Party> parties) {
        Transaction tx = null;
        List<WhiteListMatches> matches = new ArrayList<>();
        Iterator it = parties.iterator();
        while (it.hasNext()) {
            Party p = (Party) it.next();
            WhiteListMatches w = createWhiteListMatch(p);
            matches.add(w);
        }
        try {           
            hibernateSession = getSession();
            tx = hibernateSession.beginTransaction();
            WhiteList whiteListEntity = new WhiteList();
            whiteListEntity.setEntityName(entityName);

            for (WhiteListMatches wl : matches) {
                whiteListEntity.getMatches().add(wl);
            }
            hibernateSession.save(whiteListEntity);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            tx.commit();
            hibernateSession.close();
        }
    }

The WhitListMatches is being initialized from Set<Party> through createWhitListMatch helper method if someone is wondering how the list got it's data from. All my PKs are identity in the DB too.

private WhiteListMatches createWhiteListMatch(Party party) {
        WhiteListMatches whiteListMatch = new WhiteListMatches();
        whiteListMatch.setMatchEntityAddress(party.getADDRESS());
        if (party.getX_BIRTH_DT() != null) {   
               whiteListMatch.setMatchEntityDateOfBirth(party.getX_BIRTH_DT().toString());
        }
        whiteListMatch.setMatchEntityName(party.getENTITY_NAME());
        whiteListMatch.setMatchEntityPlaceOfBirth(party.getPLACE_OF_BIRTH());
        whiteListMatch.setMatchEntityYearOfBirth("" + party.getX_YEAR_OF_BIRTH());
        return whiteListMatch;
    }

Upvotes: 1

Views: 1578

Answers (1)

v.ladynev
v.ladynev

Reputation: 19966

Hibernate doesn't make any additional work for you. So if you have WhiteListMatches with whiteList == null Hibernate saves that null to the database.

You can do something like that:

for (WhiteListMatches wl : matches) {
    wl.setWhiteList(whiteListEntity);
    whiteListEntity.getMatches().add(wl);
}

Also it is common practice to have such method in the WhiteList

public void addMatches(List<WhiteListMatches> matches) {
    for (WhiteListMatches wl : matches) {
        wl.setWhiteList(this);
        this.matches.add(wl);
    }
}     

Upvotes: 1

Related Questions