jsf - 数据表中的外键
jsf - foreign key in datatable
我在数据表中显示订单列表,其中一列必须显示该订单的 customer_id:customer_id 是多对一关系中的 fk。
客户实体
@Entity
public class Customer {
///other columns
@OneToMany(mappedBy = "cliente", fetch=FetchType.EAGER)
private List<Order> orders;
订单实体
@Entity
@Table(name = "orders")
public class Order implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column (nullable = false)
private String state;
@Column (nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar openingDate;
@Column (nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Calendar closingDate;
@Column (nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Calendar evadingDate;
@ManyToOne(cascade={ CascadeType.PERSIST, CascadeType.REMOVE },fetch=FetchType.LAZY)
@JoinColumn(name = "customer_id")
private Customer customer;
最后,这是我放置包含所有订单的数据表的页面。
showOrders.xhtml
<h:dataTable id="list" value="#{orderController.orders}"
var="order">
<h:column>
<f:facet name="header">Nome</f:facet>
<h:commandLink action="#{orderController.findOrder}"
value="#{order.id}" style="color: orange">
<f:setPropertyActionListener target="#{orderController.id}"
value="#{order.id}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">Stato</f:facet>
<h:outputText value="#{order.state}" />
</h:column>
<h:column>
<f:facet name="header">Data Apertura</f:facet>
<h:outputText value="#{order.openingDate.time}">
<f:convertDateTime datestyle="full" type="date" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Data Chiusura</f:facet>
<h:outputText value="#{order.closingDate.time}">
<f:convertDateTime datestyle="full" type="date" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Data Evasione</f:facet>
<h:outputText value="#{order.evadingDate.time}">
<f:convertDateTime datestyle="full" type="date" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">ID Cliente</f:facet>
<h:commandLink action="#{registerCustomer.detailsCustomer}"
value="#{order.customer.id}" style="color: orange">
<f:setPropertyActionListener target="#{registerCustomer.id}"
value="#{order.customer.id}" />
</h:commandLink>
</h:column>
问题是,除了 customer_id 没有显示在页面上之外,一切都很好。我做错了什么?
我尝试了很多东西,改变了抓取类型,改变了关系......但我开始认为这是一个 java 问题,即使我真的找不到解决方案或一些解释在网上。有人可以帮我吗?我卡住了:/
由于您的 Order
与 Customer
相关,您需要做的是仍然使用延迟加载但能够初始化给定订单的客户
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
ord = (Order) session.get(Order.class, id_order);
Hibernate.initialize(ord.getCustomer());
session.getTransaction().commit();
Customer cust = ord.getCustomer();
还要检查您是否拥有集合并与 customer_id JOIN
相关联
Customer getCustomer() { }
setCustomer(Customer cust) { }
我很高兴地说我找到了解决方案! (感谢@Mauricio Gracia 启发了我寻找解决方案的路径)
首先,我从订单class
中的客户关系中删除了"fetch = FetchType.LAZY"
@ManyToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name = "customer_id")
private Customer customer;
然后,我序列化了客户class
@Entity
public class Customer implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
一切正常,我可以在我的 .xhtml 页面中看到客户 ID :))
但是,我不知道这是否是一个好的做法,但我认为我可以在像这样的小型大学项目中冒险!感谢大家
我在数据表中显示订单列表,其中一列必须显示该订单的 customer_id:customer_id 是多对一关系中的 fk。
客户实体
@Entity
public class Customer {
///other columns
@OneToMany(mappedBy = "cliente", fetch=FetchType.EAGER)
private List<Order> orders;
订单实体
@Entity
@Table(name = "orders")
public class Order implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column (nullable = false)
private String state;
@Column (nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Calendar openingDate;
@Column (nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Calendar closingDate;
@Column (nullable = true)
@Temporal(TemporalType.TIMESTAMP)
private Calendar evadingDate;
@ManyToOne(cascade={ CascadeType.PERSIST, CascadeType.REMOVE },fetch=FetchType.LAZY)
@JoinColumn(name = "customer_id")
private Customer customer;
最后,这是我放置包含所有订单的数据表的页面。
showOrders.xhtml
<h:dataTable id="list" value="#{orderController.orders}"
var="order">
<h:column>
<f:facet name="header">Nome</f:facet>
<h:commandLink action="#{orderController.findOrder}"
value="#{order.id}" style="color: orange">
<f:setPropertyActionListener target="#{orderController.id}"
value="#{order.id}" />
</h:commandLink>
</h:column>
<h:column>
<f:facet name="header">Stato</f:facet>
<h:outputText value="#{order.state}" />
</h:column>
<h:column>
<f:facet name="header">Data Apertura</f:facet>
<h:outputText value="#{order.openingDate.time}">
<f:convertDateTime datestyle="full" type="date" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Data Chiusura</f:facet>
<h:outputText value="#{order.closingDate.time}">
<f:convertDateTime datestyle="full" type="date" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">Data Evasione</f:facet>
<h:outputText value="#{order.evadingDate.time}">
<f:convertDateTime datestyle="full" type="date" />
</h:outputText>
</h:column>
<h:column>
<f:facet name="header">ID Cliente</f:facet>
<h:commandLink action="#{registerCustomer.detailsCustomer}"
value="#{order.customer.id}" style="color: orange">
<f:setPropertyActionListener target="#{registerCustomer.id}"
value="#{order.customer.id}" />
</h:commandLink>
</h:column>
问题是,除了 customer_id 没有显示在页面上之外,一切都很好。我做错了什么? 我尝试了很多东西,改变了抓取类型,改变了关系......但我开始认为这是一个 java 问题,即使我真的找不到解决方案或一些解释在网上。有人可以帮我吗?我卡住了:/
由于您的 Order
与 Customer
相关,您需要做的是仍然使用延迟加载但能够初始化给定订单的客户
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
ord = (Order) session.get(Order.class, id_order);
Hibernate.initialize(ord.getCustomer());
session.getTransaction().commit();
Customer cust = ord.getCustomer();
还要检查您是否拥有集合并与 customer_id JOIN
相关联Customer getCustomer() { }
setCustomer(Customer cust) { }
我很高兴地说我找到了解决方案! (感谢@Mauricio Gracia 启发了我寻找解决方案的路径)
首先,我从订单class
中的客户关系中删除了"fetch = FetchType.LAZY"@ManyToOne(cascade={CascadeType.PERSIST})
@JoinColumn(name = "customer_id")
private Customer customer;
然后,我序列化了客户class
@Entity
public class Customer implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
一切正常,我可以在我的 .xhtml 页面中看到客户 ID :)) 但是,我不知道这是否是一个好的做法,但我认为我可以在像这样的小型大学项目中冒险!感谢大家