Java Hibernate - 返回null对象的OneToMany关系(注释)

时间:2013-11-08 10:50:52

标签: java mysql hibernate dropwizard

我目前正在使用hibernate中的注释来解决一对多的映射问题,每当我得到一个对象时,从相关表返回的项集总是为空(即使我在数据库中看到有相应的与数据的关系)。我在同一个班级中有多对一的关系,这些关系正常。

为了便于阅读,省略了其他不相关的代码

我有两个表,其中一个成员可以有0个或更多成员成员资格期:

CREATE TABLE member (
    member_id INT NOT NULL AUTO_INCREMENT
    PRIMARY KEY (member_id)
)

CREATE TABLE member_membership_period (
    member_membership_period_id INT NOT NULL AUTO_INCREMENT ,
    member_id INT NOT NULL ,
    test_column VARCHAR(45) NOT NULL ,
    PRIMARY KEY (member_membership_period_id) ,
    INDEX member_membership_period_member_idx (member_id ASC) ,
    CONSTRAINT member_membership_period_member
        FOREIGN KEY (member_id)
        REFERENCES member (member_id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)

Member类映射到成员表:

@Entity
@Table(name="member")
public class Member implements Serializable  {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "member_id")
    private int id;

    @OneToMany
    @JoinColumn(name = "member_id")
    @ForeignKey(name = "member_membership_period_member")
    private Set<MemberMembershipPeriod> memberMembershipPeriods = new HashSet<MemberMembershipPeriod>();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Set<MemberMembershipPeriod> getMemberMembershipPeriods() {
        return memberMembershipPeriods;
    }

    public void setMemberMembershipPeriods(Set<MemberMembershipPeriod> memberMembershipPeriods) {
        this.memberMembershipPeriods = memberMembershipPeriods;
    }
}

MemberMembershipPeriod类映射到member_membership_period表

@Entity
@Table(name="member_membership_period")
public class MemberMembershipPeriod implements Serializable {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "member_membership_period_id")
    private int id;

    @Column(name = "test_column")
    String testColumn;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTestColumn() {
        return testColumn;
    }

    public void setTestColumn(String testColumn) {
        this.testColumn = testColumn;
    }
}

我的DAO

public class MemberDaoImpl extends AbstractDAO<Member> implements MemberDao {

    public MemberDaoImpl(SessionFactory factory) {
       super(factory);
    }

    @Override
    public List<Member> getAllMembers() {
        Query query = currentSession().createQuery("from Member");
        return list(query);
    }

    @Override
    public Member getMemberById(int id) {
        return get(id);
    }
}

实现get(id)(drop wizards hibernate package的一部分)

protected E get(Serializable id) {
    return (E) currentSession().get(entityClass, checkNotNull(id));
}

我们将非常感谢所提供的任何帮助,我开始失去对此生活的意愿!

使用的其他技术是DropWizard(执行hibernate配置)和MySQL

1 个答案:

答案 0 :(得分:0)

试试这个。它可能会帮助你。

@Override
    public List<Member> getAllMembers() {
        Criteria criteria = currentSession().createCriteria(Member.class,"member");
        criteria.createAlias("member.memberMembershipPeriods","period");
        criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return criteria.list();
    }