0

我有一个父/子集,使用 session.get(Parent.class, index) 时我不会遇到任何问题。Parent 类有我想使用的 varchar,而不是索引 ex:ldapname。问题是我还没有找到任何其他有效的方法。我已经尝试过 session.createSQLQuery 并且只是 createQuery 并且它们以某种方式失败。

我有的..

家长

@Entity
@Table(name="CAVERE_USER")
public class CavereUser {

    @Id @GeneratedValue
    @Column(name = "user_id")
    private int user_id;

    @Column(name="first_name", nullable=false, columnDefinition="varchar", length=20, insertable=true, updatable=true)
    private String first_name;

    @Column(name="last_name", nullable=false, columnDefinition="varchar", length=20, insertable=true, updatable=true)
    private String last_name;

    @OneToMany
    @JoinColumn(name="user_id", insertable=true, updatable=true)
    @org.hibernate.annotations.IndexColumn(name="USER_ID")
    private Set<CavereAttr> cuattr = new HashSet<CavereAttr>();

getter & setters

孩子

@Entity
@Table(name="Cavere_Attr")
public class CavereAttr {

    @Id @GeneratedValue
    @Column(name = "ATTR_ID")
    private int attr_id;

    @Column(name="privlege", nullable=false, columnDefinition="varchar", length=20, insertable=true, updatable=true)
    private String privlege;

    @Column(name = "USER_ID")
    private Long user_id;
getters & setters

    @Autowired
    @Qualifier("cavereSessionFactory")
    private SessionFactory sessionFactory;

    @Override
    public CavereUser getCavereUserById(int user_id) {
        Session session = null;
        CavereUser cavereuser = null;
        try
        {
            session = sessionFactory.openSession();
            session.beginTransaction();
            cavereuser = (CavereUser)session.get(CavereUser.class, user_id);
            System.out.println("The Attr " + cavereuser.getCuattr().size());
            session.getTransaction().commit();
        }
        catch (RuntimeException e)
        {           
            System.out.println (e.getMessage());
        }   
        finally
        {
            if (session != null)
            {           
                session.close();
            }   
        }       
        return cavereuser;
    }

    @Override
    public CavereUser getCavereUserByLastName(String lastname){
        Session session = null;
        CavereUser cavereuser = null;

        int user_id = 0;
        String struser_id;
        try
        {
            session = sessionFactory.openSession();
            session.beginTransaction();

/*
 * Using JDK 7 with Spring 3 and Hibernate 4            
 */
/*
 * creatSQLQuery is returning Query for setParameter() instead of SQLQuery          
 */

            // This works getting the Parent & Child classes    
            SQLQuery sqlq = session.createSQLQuery("select user_id from cavere_user where last_name = '" + lastname + "'");

            user_id = (Integer)sqlq.uniqueResult();
            cavereuser = getCavereUserById(user_id);


            /*
             * the code below can't get the childs
             * failed to lazily initialize a collection of role: com.h1mny.implementation.CavereUser.cuattr, 
             * no session or session was closed
             */

/*          
            List<CavereUser> sUserList = session.createCriteria(CavereUser.class)
                .add(Restrictions.eq("last_name", "Lopes".toLowerCase()).ignoreCase())
*/              
/*
 * Adding this causes a syntax error that the select has the wrong syntaxt for MYSQL
                .setMaxResults(1)
*/
/*          
                .list();
            if(sUserList != null && sUserList.size() == 1){
                cavereuser = sUserList.get(0);
            }
 */         
            session.getTransaction().commit();
        }
        catch (RuntimeException e)
        {           
            System.out.println (e.getMessage());
        }   
        finally
        {
            if (session != null)
            {           
                session.close();
            }   
        }       
        return cavereuser;

    }
}
4

1 回答 1

0

尝试改变加入这个

@OneToMany
@JoinColumn(name="user_id", insertable=true, updatable=true, fetch = FetchType.EAGER)
@org.hibernate.annotations.IndexColumn(name="USER_ID")
private Set<CavereAttr> cuattr = new HashSet<CavereAttr>();

我希望这能解决你的问题

于 2013-07-04T03:37:19.517 回答