紳士淑女の皆様、
SOAP ベースの Web サービスを使用して、単純な @OneToMany Hello World タイプの例をセットアップしようとしています。セットアップは非常に簡単です。親子関係にある 2 つのエンティティです。Orders が親です。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。double 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 トランスクライバーは、2 つのエンティティ間を行き来する無限ループに突入しないように指示されます。噂によると、さらに優れた @XmlInverseReference アノテーションもありますが、機能させることはできません。