Java Hibernate - OneToMany关系返回了一个空对象(注释)

3
我目前在使用Hibernate注解时遇到了一对多映射的问题,每当我获取一个对象时,从相关表返回的项目集始终为null(即使我可以在数据库中看到有相应的关系数据)。我在同一类中有一些多对一的关系,它们运行良好。
其他无关的代码已省略以提高可读性。
我有两个表,其中单个成员可以拥有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包中的一部分)
protected E get(Serializable id) {
    return (E) currentSession().get(entityClass, checkNotNull(id));
}

任何提供的帮助都将不胜感激,我已经因此开始失去生存的意志!
其他使用的技术包括DropWizard(用于处理hibernate配置)和MySQL。

你有一个没有名称的JoinColumn。我不知道那会产生什么影响。ForeignKey只用于DDL生成。请为JoinColumn指定名称。 - Alan Hay
好的,映射看起来没问题,你能发一下加载实体的代码吗? - Alan Hay
我已经添加了我的DAO,完全忘记了那个。我需要在里面添加关系吗?(虽然对于我的ManyToOne关系,我不需要这样做)。 - Crazy Dino
你是如何为失败的测试进行加载的?是使用getById还是getAll()?请展示get(id)的实现。 - Alan Hay
我已经测试了两种方法,但是失败的测试是功能测试,这些测试通过DropWizard提供的JAX-RS接口进行(该接口还管理hibernate配置)。但是JAX-RS资源正在调用一个服务,该服务又调用DAO,因此我可以添加它们,但我认为这不会展示太多。 - Crazy Dino
显示剩余3条评论
1个回答

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();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接