首页 > 解决方案 > 为什么休眠返回具有不同别名的同一列?

问题描述

@Entity
public class Vehicle {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int number;
    private String name;
    
    @ManyToOne()
    private UserDetails user;
    
    public UserDetails getUserDetails() {
        return user;
    }
    public void setUserDetails(UserDetails user) {
        this.user = user;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Vehicle [number=" + number + ", name=" + name+"]";
    }
    
    

}
@Entity
public class UserDetails {

    @Id
    private int userId;

    private String userName;
    
    @OneToMany(cascade = CascadeType.ALL,mappedBy = "user")
    private List<Vehicle> vehicle=new ArrayList<Vehicle>();

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

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

    @Lob
    private String Description;

    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;
    }
    public String getDescription() {
        return Description;
    }

    public void setDescription(String description) {
        Description = description;
    }

    @Override
    public String toString() {
        return "UserDetails [userId=" + userId + ", userName=" + userName + ", vehicle=" + vehicle + ", Description="
                + Description + "]";
    }
    


得到以下结果。但在此结果中,突出显示的行具有相同的列名但具有不同的别名。为什么hibernate会选择同一个cloumn?

engine.transaction.jta.platform.internal.NoJtaPlatform] Hibernate:从 hibernate_sequence 中选择 next_val 作为 id_val 进行更新 Hibernate:更新 hibernate_sequence 设置 next_val=?next_val=? Hibernate: 插入 UserDetails (Description, userName, userId) 值 (?, ?, ?) Hibernate: 插入 Vehicle (name, user_userId, number) 值 (?, ?, ?) Hibernate: select userdetail0_.userId as userid1_0_0_, userdetail0_ .Description as descript2_0_0_, userdetail0_.userName as username3_0_0_ from UserDetails userdetail0_ where userdetail0_.userId=? Hibernate:选择vehicle0_.number作为number1_1_0_,vehicle0_.name作为name2_1_0_,vehicle0_.user_userId作为user_use3_1_0_,userdetail1_.userId作为userid1_0_1_,userdetail1_.Description作为descript2_0_1_,userdetail1_。userName as username3_0_1_ from Vehicle vehicle0_ left outer join UserDetails userdetail1_ on vehicle0_.user_userId=userdetail1_.userId where vehicle0_.number=? 休眠:选择 vehicle0_.user_userId 作为 user_use3_1_0_,vehicle0_.number 作为 number1_1_0_,vehicle0_.number 作为 number1_1_1_,vehicle0_.name 作为 name2_1_1_,vehicle0_.user_userId 作为 user_use3_1_1_ from Vehicle vehicle0_ where vehicle0_.user_userId=? 用户名 ==> UserDetails [userId=0, userName=Vickram, vehicle=[Vehicle [number=1, name=Car]], Description=Tall white] 车辆 ===>UserDetails [userId=0, userName=Vickram,车辆=[车辆[编号=1,名称=汽车]],描述=高白]

标签: hibernate

解决方案


那是因为 6.0 版之前的 Hibernate 没有专门的 SQL AST 模型来去重。属性的每个列映射只是“传递”到 SQL,即它为需要初始化的每个属性选择相应的映射列。


推荐阅读