以下に単純な 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 コードは含めませんでした。これは、マーシャリング中に問題が発生したことを示しています。