1

以下に単純な Hibernate POJO を貼り付けました (簡潔にするために、コンストラクターとセッターは削除されています)。私の問題は、「ユーザー」関係で発生します。Hibernate はリレーションを問題なく遅延読み込みしますが、CRUD Web サービス呼び出し (以下も参照) がこのオブジェクトのインスタンスをマーシャリングすると、リレーションの「get」メソッドが呼び出され、JAXB がアクセスしていないため、Hibernate で「No transaction」例外がスローされます。セッションまたはトランザクション内の関係。

ポジョ:

@Entity
@Table(name = "ldapservers", uniqueConstraints = @UniqueConstraint(columnNames = "hostname"))
@XmlRootElement(name = "ldap-server")
@SuppressWarnings("unused")
public class LdapServer implements Serializable
{
    private int ldapServerId;
    private String hostname;
    private int port;
    private Date createDate;
    private String createUser;
    private Set<User> users = new HashSet<User>(0);
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "ldapServerID", unique = true, nullable = false)
    @XmlAttribute(name="id")
    public int getLdapServerId()
    {
        return this.ldapServerId;
    }
    @Column(name = "hostname", unique = true, nullable = false)
    @XmlElement
    public String getHostname()
    {
        return this.hostname;
    }
    @Column(name = "port", nullable = false)
    @XmlElement
    public int getPort()
    {
        return this.port;
    }
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "createDate", nullable = false, length = 19)
    @XmlAttribute(name="create-date")
    public Date getCreateDate()
    {
        return this.createDate;
    }
    @Column(name = "createUser", nullable = false)
    @XmlAttribute(name="create-user")
    public String getCreateUser()
    {
        return this.createUser;
    }
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "ldapServer")
    public Set<User> getUsers()
    {
        return this.users;
    }
}

Web サービス呼び出し:

    @GET
@Path("/fetch/{id}")
@Produces("application/xml")
public LdapServer getLdapServer(@PathParam("id") int ldapServerID)
{
    logger.debug("Fetching LdapServer ID "+ldapServerID);
    LdapServer ls = this.home.findById(ldapServerID);

    if (ls!=null)
    {
        logger.debug("Found LdapServer ID "+ldapServerID);
    }
    else
    {
        logger.debug("LdapServer ID "+ldapServerID+" not found.");
    }

    return ls;
}

エラーは Resteasy 内およびこの呼び出しの外部で発生するため、DAO/EJB コードは含めませんでした。これは、マーシャリング中に問題が発生したことを示しています。

4

1 に答える 1

0

私もしばらく前に同じ問題を抱えていました。resteasy メソッドの開始時に休止状態のセッションとトランザクションが開いていて、メソッドの最後でそれを閉じていると仮定しています。問題は、遅延読み込みがユーザーにプロキシ オブジェクトを返すことです。ステップ デバッグして、ls.getUsers() を実行できます。タイプはプロキシです。そのプロキシで何かにアクセスすると、実際のオブジェクトのみがフェッチされます。あなたの場合、これはマーシャリング中に発生しますが、その時点までにセッション/トランザクションが閉じられているため、エラーが発生します。resteasy メソッド内で ls.getUsers.size() のようなものにアクセスする場合、プロキシは期待どおりの実際のオブジェクトになり、マーシャリングは機能しますが、これを行う必要があるのは面倒です。私が問題を抱えていたとき、私は熱心に取り組み、この混乱を避けることにしました。しかし今、https://hibernate.onjira.com/browse/HHH-7457

于 2013-02-27T08:59:59.547 に答える