【问题标题】:one to one mapping Entity class from dataBase using netbeans jpa使用netbeans jpa从数据库一对一映射实体类
【发布时间】:2016-03-23 05:17:25
【问题描述】:

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

我需要 jsf dataTable 列中的 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;
//    }

【问题讨论】:

  • 你知道hibernate的一对一映射吗?
  • 我添加这条评论是为了让其他人清楚地回答,他在实体 IasLables 中有一个复合键,在实体 LangDef 中有一个普通主键,所以他发现很难做 oneToOne 映射

标签: jsf datatable hibernate-mapping


【解决方案1】:

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

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

2) 回答

现在您有备用选项 1)你需要像下面这样创建普通类

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) 您需要关注服务类的变化

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

}

【讨论】:

  • model.setLangDef(langDefDAO.findByPk(lasLabels.getLangNo()));....这里出现错误 getLangNo()
  • findByPk 这是您的函数名称,其中一个字段根据您的 DAO 类方法从实体 pk 数据,它只是一个示例 * lasLabels.getLangNo() 它的 langNo 对象来自您的 lasLabels 实体
  • langDefDAO.findBYID() 与 Lang_No 短参数对吗?
  • LANG_NO 1 1 1 N NUMBER (2) 无 4 0 0.25 错误
  • langDefDAO.findBYID(LANG_NO) 这样你就得到了颗粒主键的实体对象
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多