Hibernate的问题:查询列表时自动添加记录

时间:2012-11-10 09:05:49

标签: java spring hibernate

我正在使用 - Hibernate 4 - Spring 3

我遇到了一个我无法理解的问题:当我尝试在Hibernate中检索对象列表时,我的数据库的另一个表填充了行。我怀疑我设置的“CASCADE”和“FETCHING”属性有些问题,但我真的无法理解。

让我解释一下这个问题。

这里有4个实体:

  1. 拥有所有凭据的用户,例如usernameisEnabledAuthorities List及类似内容
  2. 记录用户角色的权威机构
  3. 一个ProfiledUser,其中包含与profile dataaddress data相关的所有内容,以及checkups的列表,最后
  4. 具有一些数据和对用户的引用的检查
  5. 我试图建模以下

    enter image description here

    这是课程:用户

    @Entity
    @Table(name="USERS")
    @Inheritance(strategy=InheritanceType.JOINED)
    public class User implements UserDetails, DomainObject {
    
        private static final long serialVersionUID = 1L;
        private long id;
        //other stuff here
        Set<Authority> authorities = new HashSet<Authority>();
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="id", unique=true, nullable=false)
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        @ElementCollection(fetch=FetchType.EAGER)
        @JoinTable(name="AUTHORITIES", joinColumns=@JoinColumn(name="user_id"))
        public Set<Authority> getAuthorities() {
            return authorities;
        }
    
        public void setAuthorities(Set<Authority> authorities) {
            this.authorities = authorities;
        }   
    }
    

    ProfiledUSer

    @Entity
    @Table(name="PROFILED_USERS")
    public class ProfiledUser extends User{
    
        private static final long serialVersionUID = 1L;
        //other stuff here. Everything with CASCADE ALL
        private Collection<Checkup> checkupMap = new HashSet<Checkup>();
    
        public ProfiledUser() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
        public Collection<Checkup> getCheckupMap() {
            return checkupMap;
        }
    
        public void setCheckupMap(Collection<Checkup> checkupMap) {
            this.checkupMap = checkupMap;
        }
    }
    

    体检

    @Entity
    @Table(name="CHECKUPS")
    public class Checkup implements DomainObject{
    
        private long id;
        private ProfiledUser profiledUser;
        //other stuff here everyithing fetched EAGERLY
        private boolean pending = true;
    
        public Checkup() {
            super();
        }
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        @Column(name="id")
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        @OneToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="profiledUser")
        public ProfiledUser getProfiledUser() {
            return profiledUser;
        }
    
        public void setProfiledUser(ProfiledUser profiledUser) {
            this.profiledUser = profiledUser;
        }
    
        @Column(name="pending")
        public boolean isPending() {
            return pending;
        }
    
        public void setPending(boolean pending) {
            this.pending = pending;
        }
    }
    

    最后权限

    @Embeddable
    public class Authority implements GrantedAuthority{
    
        private static final long serialVersionUID = 1L;
        private String authority;  //Spring Security demands them to start with "ROLE_"
    
        public Authority() {
            super();
        }
    
        @Column(name="authority")
        public String getAuthority() {
            return this.authority;
        }
    
        //the administer is the one allowed to change the users' role
        @RolesAllowed("ROLE_ADMIN")
        public void setAuthority(String authority) {
            if(!authority.startsWith("ROLE_"))
                authority= (new String("ROLE_")).concat(authority.toUpperCase());
            this.authority = authority.toUpperCase();
        }
    }
    

    现在问题。当我尝试检索PENDING检查的LIST(pending是Checkup的布尔属性)时,执行以下操作

    @SuppressWarnings("unchecked")
    @Override
    public List<Checkup> loadPendingCheckups()
    {
        Session session = sessionFactory.getCurrentSession();
        Query query = session.createQuery("from " + objName + " where pending is true");
        List<Checkup> checkupList = query.list();
        if(checkupList.isEmpty())
            return null;
        else
            return checkupList;
    }
    

    此方法来自CheckupDaoImpl,注明@Transactional

    Hibernate开始删除并从Authority表中添加大量行。例如,它删除用户2的角色ROLE_USER,并添加两次,以便用户2的ROLE_USER数量随时间翻倍:1,2,4,8,16,32,64 , ... 等等。 我真的不明白为什么要求SELECT它最终会有一个WRITE操作! 请帮助我,因为我真的不知道问题在哪里!

    修改

    当我调用loadPendingCheckups()时,我可以在控制台中阅读以下内容:

    Hibernate: select checkup0_.id as id0_, checkup0_.date as date0_, checkup0_.ending_measurement as ending6_0_, checkup0_.mid_measurement as mid7_0_, checkup0_.pending as pending0_, checkup0_.physiology as physiology0_, checkup0_.profiledUser as profiled9_0_, checkup0_.quiet_measurement as quiet10_0_, checkup0_.maxTrainingFrequency as maxTrain4_0_, checkup0_.minTrainingFrequency as minTrain5_0_, checkup0_.scale_outcome as scale11_0_ from CHECKUPS checkup0_ where checkup0_.pending=1
    Hibernate: select measuremen0_.id as id1_0_, measuremen0_.average_pressure as average2_1_0_, measuremen0_.diastolic_pressure as diastolic3_1_0_, measuremen0_.heart_rate as heart4_1_0_, measuremen0_.spO2 as spO5_1_0_, measuremen0_.systolic_pressure as systolic6_1_0_ from MEASUREMENTS measuremen0_ where measuremen0_.id=?
    Hibernate: select measuremen0_.id as id1_0_, measuremen0_.average_pressure as average2_1_0_, measuremen0_.diastolic_pressure as diastolic3_1_0_, measuremen0_.heart_rate as heart4_1_0_, measuremen0_.spO2 as spO5_1_0_, measuremen0_.systolic_pressure as systolic6_1_0_ from MEASUREMENTS measuremen0_ where measuremen0_.id=?
    Hibernate: select physiology0_.id as id2_0_, physiology0_.height as height2_0_, physiology0_.morphism_type as morphism3_2_0_, physiology0_.structure_type as structure4_2_0_, physiology0_.weight as weight2_0_ from PHYSIOLOGIES physiology0_ where physiology0_.id=?
    Hibernate: select profiledus0_.id as id7_9_, profiledus0_1_.account_non_expired as account2_7_9_, profiledus0_1_.account_non_locked as account3_7_9_, profiledus0_1_.credentials_non_expired as credenti4_7_9_, profiledus0_1_.enabled as enabled7_9_, profiledus0_1_.password as password7_9_, profiledus0_1_.username as username7_9_, profiledus0_.address_data as address3_8_9_, profiledus0_.contact_data as contact4_8_9_, profiledus0_.personal_data as personal5_8_9_, profiledus0_.subscription_date as subscrip1_8_9_, authoritie1_.user_id as user1_7_11_, authoritie1_.authority as authority11_, addressdat2_.id as id4_0_, addressdat2_.country as country4_0_, addressdat2_.location as location4_0_, addressdat2_.street as street4_0_, addressdat2_.street_number as street5_4_0_, addressdat2_.zip_code as zip6_4_0_, checkupmap3_.profiledUser as profiled9_7_12_, checkupmap3_.id as id12_, checkupmap3_.id as id0_1_, checkupmap3_.date as date0_1_, checkupmap3_.ending_measurement as ending6_0_1_, checkupmap3_.mid_measurement as mid7_0_1_, checkupmap3_.pending as pending0_1_, checkupmap3_.physiology as physiology0_1_, checkupmap3_.profiledUser as profiled9_0_1_, checkupmap3_.quiet_measurement as quiet10_0_1_, checkupmap3_.maxTrainingFrequency as maxTrain4_0_1_, checkupmap3_.minTrainingFrequency as minTrain5_0_1_, checkupmap3_.scale_outcome as scale11_0_1_, measuremen4_.id as id1_2_, measuremen4_.average_pressure as average2_1_2_, measuremen4_.diastolic_pressure as diastolic3_1_2_, measuremen4_.heart_rate as heart4_1_2_, measuremen4_.spO2 as spO5_1_2_, measuremen4_.systolic_pressure as systolic6_1_2_, measuremen5_.id as id1_3_, measuremen5_.average_pressure as average2_1_3_, measuremen5_.diastolic_pressure as diastolic3_1_3_, measuremen5_.heart_rate as heart4_1_3_, measuremen5_.spO2 as spO5_1_3_, measuremen5_.systolic_pressure as systolic6_1_3_, physiology6_.id as id2_4_, physiology6_.height as height2_4_, physiology6_.morphism_type as morphism3_2_4_, physiology6_.structure_type as structure4_2_4_, physiology6_.weight as weight2_4_, measuremen7_.id as id1_5_, measuremen7_.average_pressure as average2_1_5_, measuremen7_.diastolic_pressure as diastolic3_1_5_, measuremen7_.heart_rate as heart4_1_5_, measuremen7_.spO2 as spO5_1_5_, measuremen7_.systolic_pressure as systolic6_1_5_, scaleoutco8_.id as id3_6_, scaleoutco8_.bmr as bmr3_6_, scaleoutco8_.body_fat as body3_3_6_, scaleoutco8_.metabolic_age as metabolic4_3_6_, scaleoutco8_.muscle_mass as muscle5_3_6_, scaleoutco8_.skeletal_mass as skeletal6_3_6_, scaleoutco8_.visceral_fat as visceral7_3_6_, scaleoutco8_.water as water3_6_, scaleoutco8_.weight as weight3_6_, contactdat9_.id as id5_7_, contactdat9_.email as email5_7_, contactdat9_.mobile as mobile5_7_, contactdat9_.phone as phone5_7_, personalda10_.id as id6_8_, personalda10_.birth_date as birth2_6_8_, personalda10_.name as name6_8_, personalda10_.second_name as second4_6_8_ from PROFILED_USERS profiledus0_ inner join USERS profiledus0_1_ on profiledus0_.id=profiledus0_1_.id left outer join AUTHORITIES authoritie1_ on profiledus0_.id=authoritie1_.user_id left outer join ADDRESS_DATA addressdat2_ on profiledus0_.address_data=addressdat2_.id left outer join CHECKUPS checkupmap3_ on profiledus0_.id=checkupmap3_.profiledUser left outer join MEASUREMENTS measuremen4_ on checkupmap3_.ending_measurement=measuremen4_.id left outer join MEASUREMENTS measuremen5_ on checkupmap3_.mid_measurement=measuremen5_.id left outer join PHYSIOLOGIES physiology6_ on checkupmap3_.physiology=physiology6_.id left outer join MEASUREMENTS measuremen7_ on checkupmap3_.quiet_measurement=measuremen7_.id left outer join SCALE_OUTCOMES scaleoutco8_ on checkupmap3_.scale_outcome=scaleoutco8_.id left outer join CONTACT_DATA contactdat9_ on profiledus0_.contact_data=contactdat9_.id left outer join PERSONAL_DATA personalda10_ on profiledus0_.personal_data=personalda10_.id where profiledus0_.id=?
    Hibernate: select measuremen0_.id as id1_0_, measuremen0_.average_pressure as average2_1_0_, measuremen0_.diastolic_pressure as diastolic3_1_0_, measuremen0_.heart_rate as heart4_1_0_, measuremen0_.spO2 as spO5_1_0_, measuremen0_.systolic_pressure as systolic6_1_0_ from MEASUREMENTS measuremen0_ where measuremen0_.id=?
    Hibernate: select measuremen0_.id as id1_0_, measuremen0_.average_pressure as average2_1_0_, measuremen0_.diastolic_pressure as diastolic3_1_0_, measuremen0_.heart_rate as heart4_1_0_, measuremen0_.spO2 as spO5_1_0_, measuremen0_.systolic_pressure as systolic6_1_0_ from MEASUREMENTS measuremen0_ where measuremen0_.id=?
    Hibernate: select physiology0_.id as id2_0_, physiology0_.height as height2_0_, physiology0_.morphism_type as morphism3_2_0_, physiology0_.structure_type as structure4_2_0_, physiology0_.weight as weight2_0_ from PHYSIOLOGIES physiology0_ where physiology0_.id=?
    Hibernate: select profiledus0_.id as id7_9_, profiledus0_1_.account_non_expired as account2_7_9_, profiledus0_1_.account_non_locked as account3_7_9_, profiledus0_1_.credentials_non_expired as credenti4_7_9_, profiledus0_1_.enabled as enabled7_9_, profiledus0_1_.password as password7_9_, profiledus0_1_.username as username7_9_, profiledus0_.address_data as address3_8_9_, profiledus0_.contact_data as contact4_8_9_, profiledus0_.personal_data as personal5_8_9_, profiledus0_.subscription_date as subscrip1_8_9_, authoritie1_.user_id as user1_7_11_, authoritie1_.authority as authority11_, addressdat2_.id as id4_0_, addressdat2_.country as country4_0_, addressdat2_.location as location4_0_, addressdat2_.street as street4_0_, addressdat2_.street_number as street5_4_0_, addressdat2_.zip_code as zip6_4_0_, checkupmap3_.profiledUser as profiled9_7_12_, checkupmap3_.id as id12_, checkupmap3_.id as id0_1_, checkupmap3_.date as date0_1_, checkupmap3_.ending_measurement as ending6_0_1_, checkupmap3_.mid_measurement as mid7_0_1_, checkupmap3_.pending as pending0_1_, checkupmap3_.physiology as physiology0_1_, checkupmap3_.profiledUser as profiled9_0_1_, checkupmap3_.quiet_measurement as quiet10_0_1_, checkupmap3_.maxTrainingFrequency as maxTrain4_0_1_, checkupmap3_.minTrainingFrequency as minTrain5_0_1_, checkupmap3_.scale_outcome as scale11_0_1_, measuremen4_.id as id1_2_, measuremen4_.average_pressure as average2_1_2_, measuremen4_.diastolic_pressure as diastolic3_1_2_, measuremen4_.heart_rate as heart4_1_2_, measuremen4_.spO2 as spO5_1_2_, measuremen4_.systolic_pressure as systolic6_1_2_, measuremen5_.id as id1_3_, measuremen5_.average_pressure as average2_1_3_, measuremen5_.diastolic_pressure as diastolic3_1_3_, measuremen5_.heart_rate as heart4_1_3_, measuremen5_.spO2 as spO5_1_3_, measuremen5_.systolic_pressure as systolic6_1_3_, physiology6_.id as id2_4_, physiology6_.height as height2_4_, physiology6_.morphism_type as morphism3_2_4_, physiology6_.structure_type as structure4_2_4_, physiology6_.weight as weight2_4_, measuremen7_.id as id1_5_, measuremen7_.average_pressure as average2_1_5_, measuremen7_.diastolic_pressure as diastolic3_1_5_, measuremen7_.heart_rate as heart4_1_5_, measuremen7_.spO2 as spO5_1_5_, measuremen7_.systolic_pressure as systolic6_1_5_, scaleoutco8_.id as id3_6_, scaleoutco8_.bmr as bmr3_6_, scaleoutco8_.body_fat as body3_3_6_, scaleoutco8_.metabolic_age as metabolic4_3_6_, scaleoutco8_.muscle_mass as muscle5_3_6_, scaleoutco8_.skeletal_mass as skeletal6_3_6_, scaleoutco8_.visceral_fat as visceral7_3_6_, scaleoutco8_.water as water3_6_, scaleoutco8_.weight as weight3_6_, contactdat9_.id as id5_7_, contactdat9_.email as email5_7_, contactdat9_.mobile as mobile5_7_, contactdat9_.phone as phone5_7_, personalda10_.id as id6_8_, personalda10_.birth_date as birth2_6_8_, personalda10_.name as name6_8_, personalda10_.second_name as second4_6_8_ from PROFILED_USERS profiledus0_ inner join USERS profiledus0_1_ on profiledus0_.id=profiledus0_1_.id left outer join AUTHORITIES authoritie1_ on profiledus0_.id=authoritie1_.user_id left outer join ADDRESS_DATA addressdat2_ on profiledus0_.address_data=addressdat2_.id left outer join CHECKUPS checkupmap3_ on profiledus0_.id=checkupmap3_.profiledUser left outer join MEASUREMENTS measuremen4_ on checkupmap3_.ending_measurement=measuremen4_.id left outer join MEASUREMENTS measuremen5_ on checkupmap3_.mid_measurement=measuremen5_.id left outer join PHYSIOLOGIES physiology6_ on checkupmap3_.physiology=physiology6_.id left outer join MEASUREMENTS measuremen7_ on checkupmap3_.quiet_measurement=measuremen7_.id left outer join SCALE_OUTCOMES scaleoutco8_ on checkupmap3_.scale_outcome=scaleoutco8_.id left outer join CONTACT_DATA contactdat9_ on profiledus0_.contact_data=contactdat9_.id left outer join PERSONAL_DATA personalda10_ on profiledus0_.personal_data=personalda10_.id where profiledus0_.id=?
    Hibernate: select measuremen0_.id as id1_0_, measuremen0_.average_pressure as average2_1_0_, measuremen0_.diastolic_pressure as diastolic3_1_0_, measuremen0_.heart_rate as heart4_1_0_, measuremen0_.spO2 as spO5_1_0_, measuremen0_.systolic_pressure as systolic6_1_0_ from MEASUREMENTS measuremen0_ where measuremen0_.id=?
    Hibernate: select measuremen0_.id as id1_0_, measuremen0_.average_pressure as average2_1_0_, measuremen0_.diastolic_pressure as diastolic3_1_0_, measuremen0_.heart_rate as heart4_1_0_, measuremen0_.spO2 as spO5_1_0_, measuremen0_.systolic_pressure as systolic6_1_0_ from MEASUREMENTS measuremen0_ where measuremen0_.id=?
    Hibernate: select physiology0_.id as id2_0_, physiology0_.height as height2_0_, physiology0_.morphism_type as morphism3_2_0_, physiology0_.structure_type as structure4_2_0_, physiology0_.weight as weight2_0_ from PHYSIOLOGIES physiology0_ where physiology0_.id=?
    Hibernate: select profiledus0_.id as id7_9_, profiledus0_1_.account_non_expired as account2_7_9_, profiledus0_1_.account_non_locked as account3_7_9_, profiledus0_1_.credentials_non_expired as credenti4_7_9_, profiledus0_1_.enabled as enabled7_9_, profiledus0_1_.password as password7_9_, profiledus0_1_.username as username7_9_, profiledus0_.address_data as address3_8_9_, profiledus0_.contact_data as contact4_8_9_, profiledus0_.personal_data as personal5_8_9_, profiledus0_.subscription_date as subscrip1_8_9_, authoritie1_.user_id as user1_7_11_, authoritie1_.authority as authority11_, addressdat2_.id as id4_0_, addressdat2_.country as country4_0_, addressdat2_.location as location4_0_, addressdat2_.street as street4_0_, addressdat2_.street_number as street5_4_0_, addressdat2_.zip_code as zip6_4_0_, checkupmap3_.profiledUser as profiled9_7_12_, checkupmap3_.id as id12_, checkupmap3_.id as id0_1_, checkupmap3_.date as date0_1_, checkupmap3_.ending_measurement as ending6_0_1_, checkupmap3_.mid_measurement as mid7_0_1_, checkupmap3_.pending as pending0_1_, checkupmap3_.physiology as physiology0_1_, checkupmap3_.profiledUser as profiled9_0_1_, checkupmap3_.quiet_measurement as quiet10_0_1_, checkupmap3_.maxTrainingFrequency as maxTrain4_0_1_, checkupmap3_.minTrainingFrequency as minTrain5_0_1_, checkupmap3_.scale_outcome as scale11_0_1_, measuremen4_.id as id1_2_, measuremen4_.average_pressure as average2_1_2_, measuremen4_.diastolic_pressure as diastolic3_1_2_, measuremen4_.heart_rate as heart4_1_2_, measuremen4_.spO2 as spO5_1_2_, measuremen4_.systolic_pressure as systolic6_1_2_, measuremen5_.id as id1_3_, measuremen5_.average_pressure as average2_1_3_, measuremen5_.diastolic_pressure as diastolic3_1_3_, measuremen5_.heart_rate as heart4_1_3_, measuremen5_.spO2 as spO5_1_3_, measuremen5_.systolic_pressure as systolic6_1_3_, physiology6_.id as id2_4_, physiology6_.height as height2_4_, physiology6_.morphism_type as morphism3_2_4_, physiology6_.structure_type as structure4_2_4_, physiology6_.weight as weight2_4_, measuremen7_.id as id1_5_, measuremen7_.average_pressure as average2_1_5_, measuremen7_.diastolic_pressure as diastolic3_1_5_, measuremen7_.heart_rate as heart4_1_5_, measuremen7_.spO2 as spO5_1_5_, measuremen7_.systolic_pressure as systolic6_1_5_, scaleoutco8_.id as id3_6_, scaleoutco8_.bmr as bmr3_6_, scaleoutco8_.body_fat as body3_3_6_, scaleoutco8_.metabolic_age as metabolic4_3_6_, scaleoutco8_.muscle_mass as muscle5_3_6_, scaleoutco8_.skeletal_mass as skeletal6_3_6_, scaleoutco8_.visceral_fat as visceral7_3_6_, scaleoutco8_.water as water3_6_, scaleoutco8_.weight as weight3_6_, contactdat9_.id as id5_7_, contactdat9_.email as email5_7_, contactdat9_.mobile as mobile5_7_, contactdat9_.phone as phone5_7_, personalda10_.id as id6_8_, personalda10_.birth_date as birth2_6_8_, personalda10_.name as name6_8_, personalda10_.second_name as second4_6_8_ from PROFILED_USERS profiledus0_ inner join USERS profiledus0_1_ on profiledus0_.id=profiledus0_1_.id left outer join AUTHORITIES authoritie1_ on profiledus0_.id=authoritie1_.user_id left outer join ADDRESS_DATA addressdat2_ on profiledus0_.address_data=addressdat2_.id left outer join CHECKUPS checkupmap3_ on profiledus0_.id=checkupmap3_.profiledUser left outer join MEASUREMENTS measuremen4_ on checkupmap3_.ending_measurement=measuremen4_.id left outer join MEASUREMENTS measuremen5_ on checkupmap3_.mid_measurement=measuremen5_.id left outer join PHYSIOLOGIES physiology6_ on checkupmap3_.physiology=physiology6_.id left outer join MEASUREMENTS measuremen7_ on checkupmap3_.quiet_measurement=measuremen7_.id left outer join SCALE_OUTCOMES scaleoutco8_ on checkupmap3_.scale_outcome=scaleoutco8_.id left outer join CONTACT_DATA contactdat9_ on profiledus0_.contact_data=contactdat9_.id left outer join PERSONAL_DATA personalda10_ on profiledus0_.personal_data=personalda10_.id where profiledus0_.id=?
    Hibernate: delete from AUTHORITIES where user_id=? and authority=?
    Hibernate: insert into AUTHORITIES (user_id, authority) values (?, ?)
    Hibernate: delete from AUTHORITIES where user_id=? and authority=?
    ...// a very lot of these
    Hibernate: insert into AUTHORITIES (user_id, authority) values (?, ?)
    Hibernate: insert into AUTHORITIES (user_id, authority) values (?, ?)
    Hibernate: insert into AUTHORITIES (user_id, authority) values (?, ?)
    //a very lot of these
    
    生理学,测量等是检查中的内容。我认为它可以被检索出来。但在那之后,它被触发了大量删除&amp;在AUTHORITY表中插入。

    编辑2: 似乎解决了用户和权限之间切换@ElementCollection@OneToMany关系的问题。幸运的是,我正在设计数据库,这个修改是允许的。问题似乎消失了,但我仍然没有弄清楚ORM奇怪行为背后的基本原理。 更确切地说,最奇怪的是,当我要求检索Checkups表单时,db Hibernate触发了大量的

    1. 删除授权项目
    2. 插入授权项目
    3. 如果有人能指出这件事,我们将非常感激。

1 个答案:

答案 0 :(得分:3)

我不确定这是您的问题的原因,但ProfiledUserCheckup之间的双向关系配置不正确。

双向一对多关系配置如下:

  • 一方注释@ManyToOne,另一方注明@OneToMany
  • @OneToMany必须有mappedBy属性,指向相应的@ManyToOne属性
  • 物理映射注释(@JoinColumn)应位于@ManyToOne

这样的事情:

public class ProfiledUser extends User{
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy = "profiledUser")
    public Collection<Checkup> getCheckupMap() {
        return checkupMap;
    }
    ...
}

public class Checkup implements DomainObject {
    @ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="profiledUser")
    public ProfiledUser getProfiledUser() {
        return profiledUser;
    }
    ...
}