java - @OneToOne 和 @JoinColumn 上的映射实体为 null

标签 java hibernate jpa

我得到的映射实体始终为空,但是 FetchType.EAGER 已设置。我有一个 Booking 实体类,它映射到其他两个实体 - Slot 和 Subscriber。当我获取预订实体时,这两个实体都为空

预订舱位

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

如果我在映射时错过了某些配置,请告诉我

编辑1 添加了如何加载实体的代码

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

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

最佳答案

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

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

关于java - @OneToOne 和 @JoinColumn 上的映射实体为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33465871/

相关文章:

java - Android:将墙纸更改为可绘制

java - 如何捕获弹出窗口上显示的数据

java - 如何判断其中一代堆是否已满?

hibernate 可选连接 - 需要以任何方式返回连接列值

java - 如何与 JPA 注释建立一对多的双向关系,集合方拥有它

java - 当 DB 有这样的约束时,为什么要使用 JPA/Hibernate 约束注释

java - @EJBworkflowDao在服务层为空

hibernate - QueryDsl 交叉联接返回零个元素

java - 从 excel : suggestions for design or approach for better performance 批量加载 Hibernate

java - 大对象不能在自动提交模式下使用