2015-11-01 58 views
0

我得到的映射实体总是为空,但是FetchType.EAGER已经设置好了。我有一个预订实体类映射到两个其他实体 - 插槽和订阅服务器。无论是实体是空,当我取预定实体带有@JoinColumn @OneToOne上的映射实体null

舱位

import java.util.Date; 
import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.Version; 


@Entity 
@Table(name = "BOOKING") 
public class Booking { 

    public Booking(){ 

    } 

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

    @Column(name = "title") 
    private String title; 

    @Column(name = "descr") 
    private String desc; 


    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name = "slotid",insertable = false, updatable = false) 
    private Slot slot; 

    private Integer slotid; 

    private Integer subscriberid; 


    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name = "subscriberid",insertable = false, updatable = false) 
    private User subscriber; 

    @Column(name = "created") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date created; 

    public Integer getId() { 
     return id; 
    } 

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

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name = "slotid",referencedColumnName="slotid") 
    public Slot getSlot() { 
     return slot; 
    } 

    public void setSlot(Slot slot) { 
     this.slot = slot; 
    } 

    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name = "subscriberid",referencedColumnName="userid") 
    public User getSubscriber() { 
     return subscriber; 
    } 

    public void setSubscriber(User subscriber) { 
     this.subscriber = subscriber; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public String getDesc() { 
     return desc; 
    } 

    public void setDesc(String desc) { 
     this.desc = desc; 
    } 

    public Integer getSlotid() { 
     return slotid; 
    } 

    public void setSlotid(Integer slotid) { 
     this.slotid = slotid; 
    } 

    public Integer getSubscriberid() { 
     return subscriberid; 
    } 

    public void setSubscriberid(Integer subscriberid) { 
     this.subscriberid = subscriberid; 
    } 



} 

时隙等级

import java.util.Date; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.persistence.Version; 

@Entity 
@Table(name="SLOT") 
public class Slot { 

    public Slot(){ 

    } 

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

    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="ownerid",insertable = false, updatable = false) 
    private User user; 

    @Column(name="startdate") 
    private Date startdate; 

    @Column(name="enddate") 
    private Date enddate; 

    @Column(name="status") 
    private String status; 

    private Integer ownerid; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "created", nullable = false, updatable=false) 
    @Version 
    private Date created; 

    public Integer getId() { 
     return id; 
    } 

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

    public User getUser() { 
     return this.user; 
    } 

    public void setUser(User owner) { 
     this.user = owner; 
    } 




    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public Integer getOwnerid() { 
     return ownerid; 
    } 

    public void setOwnerid(Integer ownerid) { 
     this.ownerid = ownerid; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public Date getStartdate() { 
     return startdate; 
    } 

    public void setStartdate(Date startdate) { 
     this.startdate = startdate; 
    } 

    public Date getEnddate() { 
     return enddate; 
    } 

    public void setEnddate(Date enddate) { 
     this.enddate = enddate; 
    } 

} 

用户 - 用户类

import java.util.Date; 

import javax.persistence.CascadeType; 
import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.OneToOne; 
import javax.persistence.PrimaryKeyJoinColumn; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 


@Entity 
@Table(name="users") 
public class User { 


    public User(){ 

    } 

    @[email protected](strategy = GenerationType.IDENTITY) 
    @Column(name="userid") 
    private Integer userid = 0; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "mobile") 
    private String mobile; 

    @Column(name = "password") 
    private String password; 

    @Column(name = "email") 
    private String email; 

    @Column(name = "type") 
    private String userType; 

    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="cityid",insertable = false, updatable = false) 
    private City city; 

    private String cityid; 


    @OneToOne(fetch=FetchType.EAGER) 
    @JoinColumn(name="specialityid",insertable = false, updatable = false) 
    private Speciality speciality; 

    private Integer specialityid; 


    @Column(name="medregno") 
    private String regno; 

    @Column(name="refcode") 
    private String referalcode; 

    public String getRegno() { 
     return regno; 
    } 

    public void setRegno(String regno) { 
     this.regno = regno; 
    } 

    public String getReferalcode() { 
     return referalcode; 
    } 

    public void setReferalcode(String referalcode) { 
     this.referalcode = referalcode; 
    } 

    @Column(name = "gender") 
    private String gender; 

    @Column(name = "active") 
    private boolean active; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "updated") 
    private Date updated; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "created") 
    private Date created; 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     User other = (User) obj; 
     if (userid != other.userid) 
      return false; 
     return true; 
    } 

    public Integer getUserid() { 
     return userid; 
    } 

    public void setUserid(Integer userid) { 
     this.userid = userid; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getMobile() { 
     return mobile; 
    } 

    public void setMobile(String mobile) { 
     this.mobile = mobile; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getUserType() { 
     return userType; 
    } 

    public void setUserType(String userType) { 
     this.userType = userType; 
    } 


    public City getCity() { 
     return city; 
    } 

    public void setCity(City city) { 
     this.city = city; 
    } 

    public String getGender() { 
     return gender; 
    } 

    public void setGender(String gender) { 
     this.gender = gender; 
    } 


    public boolean isActive() { 
     return active; 
    } 

    public void setActive(boolean active) { 
     this.active = active; 
    } 

    public Date getCreated() { 
     return created; 
    } 

    public void setCreated(Date created) { 
     this.created = created; 
    } 

    public Date getUpdated() { 
     return updated; 
    } 

    public void setUpdated(Date updated) { 
     this.updated = updated; 
    } 

    public String getCityid() { 
     return cityid; 
    } 

    public void setCityid(String cityid) { 
     this.cityid = cityid; 
    } 

    public Speciality getSpeciality() { 
     return speciality; 
    } 

    public void setSpeciality(Speciality speciality) { 
     this.speciality = speciality; 
    } 

    public Integer getSpecialityid() { 
     return specialityid; 
    } 

    public void setSpecialityid(Integer specialityid) { 
     this.specialityid = specialityid; 
    } 


} 

booking.getSlot()booking.getSubscriber()回报null

请让我知道如果我错过了一些配置,同时映射

EDIT1 添加代码的实体是越来越加载

public Booking addBooking(String title,String desc,int slotid,int subscriberid,Session session){ 
     Booking booking = new Booking(); 
     booking.setTitle(title); 
     booking.setDesc(desc); 
     booking.setSlotid(slotid); 
     booking.setSubscriberid(subscriberid); 
     booking.setCreated(new Date()); 
     Integer bookingid = (Integer) session.save(booking); 
     session.flush(); 
     Booking bookingEntity = (Booking) session.createQuery("From Booking where id = ?"). 
       setParameter(0, bookingid).list().get(0); 
     return bookingEntity; 
    } 

我节省了实体并重新加载它。

+0

您能否显示提取预订的查询? –

+0

@Bill Bilal我刚更新了取得预订的代码。 – Keerthivasan

+0

试试这个:session.get(Booking.class,bookingid);它工作吗? –

回答

1

它不工作,因为Hibernate是重新调整它已经在其第一级高速缓存,同一个实例不具有任何其他2个实体的参考。

为了解决这个问题,你必须做一个session.refresh(booking)而不是执行查询。

1

在您的代码:

booking.setSlotid(slotid); 
booking.setSubscriberid(subscriberid); 

你只是设置整数值,而不是对象。取而代之的是,尝试设置对象:

booking.setSlot(new Slot(slotid)); 
booking.setSubscriber(new Subscriber(subscriberid)); 

但作为@Augusto说,你在会话(插槽和用户),其具有的关联不是它们只包含它们的ID满对象。这就是为什么你不能获得这些对象的其他领域。

+0

Hibernate不知道在预订实体中的subscriberid和Subscriber关联关系。同样想到槽和slotid。 –

+0

有效点。但是,我在保存实体时使用这些字段。没有涉及的关系 – Keerthivasan

+0

好的,我希望我回答你的问题。 –