使用 netbeans jpa 从数据库一对一映射实体 class

one to one mapping Entity class from dataBase using netbeans jpa

jsf 单个数据表。我想从不同实体 class 的数据库 table 列中获取值。一个实体 class 是 IASLABELS,主键是 LANG_NO 和 LABELS_NO,另一个实体 class 是 LANGDEF 主键是 LANG_NO.

我需要在 jsf 数据表列中 LANG_NAME。

@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;
//    }

1) 答案: 您有第一个选项,休眠实体根据您的数据库添加外键主键 table 并使用我昨天给出的答案

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

2) 答案

现在你有备用选项 1) 你需要创建正常的 class 就像下面的

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) 您需要在管理 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) 您需要对服务进行以下更改 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) 您需要在 XHTML 文件中进行流动更改

<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> 

希望你能解决问题.. :)

已编辑 您需要在 IasLabels 实体

中添加 langNo 变量
@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;
    }

}