使用 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;
}
}
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;
}
}