女士们先生们,
我正在尝试使用基于 SOAP 的 Web 服务设置一个简单的 @OneToMany Hello World 类型示例。设置相当简单:父/子关系中的两个实体。订单是父级。OrderRows 是孩子。所有这些都是使用 JDeveloper 11g 通过向导设置的。除了更改会话 bean 的名称之外,我没有修改代码。
当我尝试通过在 Orders.java 文件中包含 @OneToMany 注释和相关的列表操作(设置、添加、删除)来表达这种关系时,就会出现问题。如果我将这些注释掉并且不返回包含 OrderRows 的关联列表,那么一切都很好。包括@OneToMany,没有任何回报。这可能是某种简单的配置错误,但问题是当我右键单击会话 bean 并选择“测试 Web 服务”,选择 getOrdersFindAll() 操作,然后单击“发送请求”。我得到的只是一条漂亮的尖刻小消息,上面写着“没有要显示的内容”。所以我只是坐在这里......凌晨 2 点......想知道“威士忌探戈狐步舞?”
我查看了一些网站,例如http://biemond.blogspot.com/2011/08/expose-your-session-bean-with-jax-ws.html并通读了 Java EE 7 教程http:// docs.oracle.com/javaee/7/tutorial/doc/jaxws.htm#BNAYL都无济于事。
有没有人有任何想法?或者有人会有一些好的网站来获得一些实际的例子吗?
MySessionBean.java
import java.util.List;
import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless(name = "MySession", mappedName = "HelloWs-HelloService-MySession")
@WebService(name = "MySessionBeanService", portName = "MySessionBeanServicePort")
public class MySessionBean {
@Resource
SessionContext sessionContext;
@PersistenceContext(unitName = "HelloService")
private EntityManager em;
public MySessionBean() {
}
/** <code>select o from Orders o</code> */
public List<Orders> getOrdersFindAll() {
return em.createNamedQuery("Orders.findAll").getResultList();
}
}
我的 Orders.java 实体
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@Entity
@NamedQueries( { @NamedQuery(name = "Orders.findAll", query = "select o from Orders o") })
public class Orders implements Serializable {
@Id
@Column(name = "ORDER_ID", nullable = false)
private BigDecimal orderId;
@OneToMany(mappedBy = "orders")
private List<OrderRows> orderRowsList;
public Orders() {
}
public Orders(BigDecimal orderId, String refName) {
this.orderId = orderId;
}
public BigDecimal getOrderId() {
return orderId;
}
public void setOrderId(BigDecimal orderId) {
this.orderId = orderId;
}
public List<OrderRows> getOrderRowsList() {
return orderRowsList;
}
public void setOrderRowsList(List<OrderRows> orderRowsList) {
this.orderRowsList = orderRowsList;
}
public OrderRows addOrderRows(OrderRows orderRows) {
getOrderRowsList().add(orderRows);
orderRows.setOrders(this);
return orderRows;
}
public OrderRows removeOrderRows(OrderRows orderRows) {
getOrderRowsList().remove(orderRows);
orderRows.setOrders(null);
return orderRows;
}
}
我的persistence.xml。请注意,虽然双 jdbc 看起来很时髦,但我很确定这不是问题的根源,因为删除 @OneToMany 注释和相关方法有效。
<?xml version="1.0" encoding="windows-1252" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="HelloService">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/app/jdbc/jdbc/HelloConnDS</jta-data-source>
<class>helloservice.Orders</class>
<class>helloservice.OrderRows</class>
<properties>
<property name="eclipselink.target-server" value="WebLogic_10"/>
<property name="javax.persistence.jtaDataSource" value="java:/app/jdbc/jdbc/HelloConnDS"/>
</properties>
</persistence-unit>
</persistence>
更新
我又尝试了几件事。
1) 这似乎是一个明显的 Web 服务类型问题。如果我删除 Web 服务位并将会话 bean ( @EJB ) 注入到 jsp 的支持 bean 中,@OneToMany 关系就可以正常工作。
2) 我认为 OrderRows @ManyToOne 可能会导致无限循环,因此我将其获取类型设置为惰性。没运气。
更新#2
成功!我之前对无限循环的预感很接近。这是解决方案。
@XmlAccessorType(XmlAccessType.FIELD)
public class Child implements Serializable {
...
@XmlTransient
@ManyToOne
@JoinColumn(name = "PARENT_ID")
private Parent parent;
需要注意的重要项目是 XmlAccessorType 和 XmlTransient 注释。这告诉 XML 转录器不要陷入两个实体之间来回的无限循环。有传言说还有一个更好的 @XmlInverseReference 注释,但我无法让它工作。