java 双向OneToMany和ManyToOne给出null

whhtz7ly  于 5个月前  发布在  Java
关注(0)|答案(2)|浏览(56)

我最近开始学习Hibernate并使用Map。在我的场景中,我有一个可以拥有多辆车的用户。在进行双向Map时,在第二个表中生成的列,因为如果这个双向Map,我会得到空值。我尝试调试但没有用。
UserDetails.java

package org.hibernate.OneToMany;

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table (name = "USER_DETAILS")
public class UserDetails {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "USER_ID")
    private int userId;
    @Column(name = "USER_NAME")
    private String userName;
    @OneToMany(mappedBy="user")
    private Collection<Vehicle> vehicle = new ArrayList<Vehicle>();

    public Collection<Vehicle> getVehicle() {
        return vehicle;
    }

    public void setVehicle(Collection<Vehicle> vehicle) {
        this.vehicle = vehicle;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

}

字符串
Vehicle.java

package org.hibernate.OneToMany;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Vehicle {
    @Id
    @GeneratedValue
    private int vehicleId;
    private String vehicleName;
    @ManyToOne
    @JoinColumn(name ="USER_ID")
    private UserDetails user;

    public UserDetails getUser() {
        return user;
    }

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

    public int getVehicleId() {
        return vehicleId;
    }

    public void setVehicleId(int vehicleId) {
        this.vehicleId = vehicleId;
    }

    public String getVehicleName() {
        return vehicleName;
    }

    public void setVehicleName(String vehicleName) {
        this.vehicleName = vehicleName;
    }
}


HibernateTestOneToMany.java

package org.hibernate.OneToMany;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateTestOneToMany {

    public static void main(String[] args) {
        UserDetails user = new UserDetails();
        user.setUserName("First User");

        Vehicle vehicle = new Vehicle();
        vehicle.setVehicleName("Audi");

        Vehicle vehicle2 = new Vehicle();
        vehicle2.setVehicleName("Jeep");

        user.getVehicle().add(vehicle);
        user.getVehicle().add(vehicle2);

        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(user);
        session.save(vehicle);
        session.save(vehicle2);
        session.getTransaction().commit();

        session.close();

        sessionFactory.close();
    }

}


产出:


的数据
另外,我发现它有点难以理解,为什么我们应该更喜欢双向Map,而不是单向Map。

waxmsbnn

waxmsbnn1#

您必须在测试中示例化的Vehicle对象中设置用户。

mum43rcc

mum43rcc2#

如果有人使用spring Boot :我也尝试使用双向方法填充外键列,但我只得到null。如果我使用@OneToMany annotation,那么默认情况下会使用单向方法创建一个新表。我使用@JoinColumn对列使用@OneToMany annotation和单向方法,那么我只得到2个正确填充外键列的表。

@OneToMany(cascade = CascadeType.ALL)
    @JoinColumn
    Set<Vehicle> vs;

字符串

相关问题