【问题标题】:JAXB, Hibernate, Lazy loadingJAXB,休眠,延迟加载
【发布时间】:2013-02-22 15:52:46
【问题描述】:

我在下面粘贴了一个简单的 Hibernate POJO(为简洁起见,删除了构造函数和设置器)。我的问题出在“用户”关系上。 Hibernate 延迟加载关系就好了,但是当我的 CRUD webservice 调用(也在下面)编组这个对象的一个​​实例时,它调用关系的“get”方法,从而在 Hibernate 中抛出“No transaction”异常,因为 JAXB 没有访问会话或事务内部的关系。

POJO:

@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;
    }
}

WebService 调用:

    @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;
}

我没有包含 DAO/EJB 代码,因为错误发生在 Resteasy 内部和此调用之外,表明问题发生在编组期间。

【问题讨论】:

    标签: hibernate jaxb resteasy


    【解决方案1】:

    不久前我也遇到了同样的问题。我假设您在 resteasy 方法开始时打开了一个休眠会话和事务,并且您在方法结束时将其关闭。问题是延迟加载会向用户返回一个代理对象。您可以单步调试它并运行 ls.getUsers()。类型是代理。只有在您访问该代理中的某些内容时,它才会获取实际对象。在您的情况下,这发生在编组期间,但到那时,您的会话/事务已关闭,因此您的错误出现了。如果您要在 resteasy 方法中访问类似 ls.getUsers.size() 的东西,代理现在将是您期望的实际对象,并且编组将起作用,但必须这样做似乎很麻烦。当我遇到问题时,我只是决定急切地避免这种混乱。但是,现在有一个修复程序,您可以在这里看到 https://hibernate.onjira.com/browse/HHH-7457

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2016-08-07
      • 2015-01-01
      • 1970-01-01
      相关资源
      最近更新 更多