Search code examples
jsfdatatablehibernate-mapping

one to one mapping Entity class from dataBase using netbeans jpa


jsf single dataTable. I want to get the values from database table column from different entity class. One entity class is IASLABELS primary key is LANG_NO and LABELS_NO and another entity class is LANGDEF primary key is LANG_NO.

I need LANG_NAME in jsf dataTable column.

@Entity
@Table(name = "IAS_LABELS")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "IasLabels.findAll", query = "SELECT i FROM IasLabels i"),
    @NamedQuery(name = "IasLabels.findByLangNo", query = "SELECT i FROM IasLabels i WHERE i.iasLabelsPK.langNo = :langNo"),
    @NamedQuery(name = "IasLabels.findByLabelNo", query = "SELECT i FROM IasLabels i WHERE i.iasLabelsPK.labelNo = :labelNo"),
    @NamedQuery(name = "IasLabels.findByCaptionDet", query = "SELECT i FROM IasLabels i WHERE i.captionDet = :captionDet"),
    @NamedQuery(name = "IasLabels.findByTrnsFlg", query = "SELECT i FROM IasLabels i WHERE i.trnsFlg = :trnsFlg")})
public class IasLabels implements Serializable {

    private static final long serialVersionUID = 1L;

//    @OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
//    @PrimaryKeyJoinColumn
//    private LangDef langDef;
//
//    public LangDef getLangDef() {
//        return langDef;
//    }
//
//    public void setLangDef(LangDef langDef) {
//        this.langDef = langDef;
//    }

Solution

  • 1) Answer : You have 1st option with hibernate entity add foreign key primary key as per you database table and used my answer as gave yesterday

    Datatable displaying 2 different entity tables with relation need to get the another column values from database table

    2) Answer

    Now you have Alternate option 1) you need to create normal class like following

    public class IasLabelsWithLang implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private IasLabels  lasLabels;
        private LangDef langDef;
    
    
        public LangDef getLangDef() {
            return langDef;
        }
    
        public void setLangDef(LangDef langDef) {
            this.langDef = langDef;
        }
    
        public IasLabels getIasLabels() {
            return iasLabels;
        }
    
        public void setIasLabels(IasLabels iasLabels) {
            this.iasLabels = iasLabels;
        }   
    }
    

    2) you need to change following thing in your manage bean

    @ManagedBean
    @SessionScoped
    public class LabelsMB {
    
        static Logger logger = Logger.getLogger(LabelsMB.class);
    
        List<IasLabelsWithLang> labelsList = null;
    
        @ManagedProperty(value = "#{labelService}")
        private LabelService labelService;
    
        public LabelService getLabelService() {
             return labelService;
        }
    
        public void setLabelService(LabelService labelService) {
            this.labelService = labelService;
        }
    
        public List<IasLabelsWithLang> getListData() {
            if (labelsList == null || labelsList.isEmpty()) {
                if (this.getLabelService() != null) {
                    labelsList = this.getLabelService().getAllLabels();
                }
            }
            return labelsList;
        }
    }
    

    3) You need to following changes in your services class

    @Service
    @Transactional
    public class LabelService {
    
        static Logger logger = Logger.getLogger(LabelService.class);
    
        @Autowired
        private ILabelsDAO labelRepo;
    
        @Autowired
        private LangDefDAO langDefDAO;
    
    
        public ILabelsDAO getLabelRepo() {
            return labelRepo;
        }
    
        public void setLabelRepo(ILabelsDAO labelRepo) {
            this.labelRepo = labelRepo;
        }
    
        public List<IasLabelsWithLang> getAllLabels() {
            List<IasLabelsWithLang> list = new ArrayList<IasLabelsWithLang>();
            if (this.getLabelRepo() != null) {
                List<IasLabels> lasLabelsList = this.getLabelRepo().findAll();
                for(IasLabels lasLabels : lasLabelsList){
                    IasLabelsWithLang  model = new IasLabelsWithLang();
                    model.setIasLabels(lasLabels);
                    model.setLangDef(langDefDAO.findByPk(lasLabels.getLangNo()));
    
                    list.add(model);
                }
                return list;
            }            
            return null;
        }
    
        public Iterable<IasLabels> saveData(List<IasLabels> originalValue) {
            return labelRepo.save(originalValue);
        }
    }
    

    4) You need to do in your XHTML file for flowing changes

    <p:dataTable id="dataTable" emptyMessage="#{res.NO_RECORDS_FOUND}" var="lab" value="#{labelsMB.listData}" editable="true" editMode="cell" paginator="true" rows="10" paginatorTemplate="  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"   rowsPerPageTemplate="5,10,15"> 
    <p:column headerText="#{res.CAPTION_DET}" sortBy="#{lab.lasLabels.captionDet}" filterBy="#{lab.lasLabels.captionDet}" filterMatchMode="contains" filterStyle="width: 360px;">
        <p:cellEditor>
            <f:facet name="output">
                <h:outputText value="#{lab.lasLabels.captionDet}" />
            </f:facet>
            <f:facet name="input">
                <h:inputText value="#{lab.lasLabels.captionDet}" style="width:96%"/>
            </f:facet>
        </p:cellEditor>
        </p:column>
        <p:column headerText="#{res.LABEL_NO}" sortBy="#{lab.lasLabels.iasLabelsPK.labelNo}" filterBy="#{lab.lasLabels.iasLabelsPK.labelNo}">
            <p:outputLabel value="#{lab.iasLabelsPK.labelNo}" />
        </p:column>
        <p:column headerText="#{res.LANGUAGE_NO}" sortBy="#{lab.lasLabels.iasLabelsPK.langNo}" filterBy="#{lab.lasLabels.iasLabelsPK.langNo}" width="100">
            <p:outputLabel value="#{lab.iasLabelsPK.langNo}" />
        </p:column>
        <p:column headerText="#{res.LANGUAGE_NAME}" sortBy="#{lab.langDef.langName}" filterBy="#{lab.langDef.langName}" width="130">
            <p:outputLabel value="#{lab.langDef.langName}" />
        </p:column>
     </p:dataTable> 
    

    Hope, you would be fix problem.. :)

    EDITED You need to add langNo variable inside your IasLabels entity

    @Entity
    @Table(name = "IAS_LABELS")
    @XmlRootElement
    @NamedQueries({
        @NamedQuery(name = "IasLabels.findAll", query = "SELECT i FROM IasLabels i"),
        @NamedQuery(name = "IasLabels.findByLangNo", query = "SELECT i FROM IasLabels i WHERE i.iasLabelsPK.langNo = :langNo"),
        @NamedQuery(name = "IasLabels.findByLabelNo", query = "SELECT i FROM IasLabels i WHERE i.iasLabelsPK.labelNo = :labelNo"),
        @NamedQuery(name = "IasLabels.findByCaptionDet", query = "SELECT i FROM IasLabels i WHERE i.captionDet = :captionDet"),
        @NamedQuery(name = "IasLabels.findByTrnsFlg", query = "SELECT i FROM IasLabels i WHERE i.trnsFlg = :trnsFlg")})
    public class IasLabels implements Serializable {
    
        // langNo variable you need to add in your IasLabels entity
        @Column(name = "LANG_NO")
        private Short langNo;
    
        public Short getLangNo() {
            return langNo;
        }
    
        public void setLangNo(Short langNo) {
            this.langNo = langNo;
        }
    
    }