【问题标题】:Mapped Entity null on @OneToOne with @JoinColumn使用 @JoinColumn 在 @OneToOne 上映射实体 null
【发布时间】:2015-11-02 04:11:50
【问题描述】:

我得到的映射实体总是空的,但是 FetchType.EAGER 已经设置好了。我有一个映射到其他两个实体的预订实体类 - 插槽和订阅者。当我获取预订实体时,这两个实体都为空

预订舱位

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(){

    }

    @Id@GeneratedValue(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;
    }

我正在保存实体并重新加载它。

【问题讨论】:

  • 能否请您显示获取预订的查询?
  • @Bill Bilal 我刚刚更新了获取预订的代码。
  • 试试这个:session.get(Booking.class, bookingid);有用吗?
  • 我已经试过了。它没有用。我必须使用mappedby 吗?我刚刚从预订中选择了所有关联
  • 我认为 mappedBy 不是问题。

标签: java hibernate jpa


【解决方案1】:

它不起作用,因为 Hibernate 正在重新调整它已经在其 1 级缓存中的同一个实例,该实例没有对其他 2 个实体中的任何一个的引用。

要解决此问题,您必须执行 session.refresh(booking) 而不是执行查询。

【讨论】:

    【解决方案2】:

    在您的代码中:

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

    您只是在设置整数值而不是对象。而不是这个,尝试设置对象:

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

    但正如@Augusto 所说,您在会话中拥有的关联(插槽和订阅者)不是完整的对象,它们仅包含它们的 ID。这就是为什么您无法获取这些对象的其他字段的原因。

    【讨论】:

    • Hibernate 不知道预订实体中的订阅者 ID 和订阅者关联之间的链接。 Slot 和 slotid 也是如此。
    • 有效点。但是,我在保存实体时使用这些字段。不涉及任何关系
    • 好的,我希望我回答了你的问题。
    • 是的,感谢您的帮助。但是,还有其他我没有的 Slot 字段。插槽由其他用户创建。我们只是不知道它是哪个插槽,直到我们从插槽表中读取
    • 哪些字段?你看到数据库中的那些字段了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多