本文介绍了Spring Hibernate使用Hibernate模板在外键列中一对多插入null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实现了一对多关系(注释),如下所示:

I have implemented one to many relationship (annotation) as follows:

//用户类别

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

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

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

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

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

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

    @OneToMany(targetEntity=Address.class,cascade=CascadeType.ALL)
    @JoinColumn(name="user_id", referencedColumnName="id")
    private List<Address> addresses;

    ..... setters and getters
 }

//地址类别

    @Entity
    @Table(name="address")
    public class Address {

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

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

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

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

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

        ... setters and getters

    }

问题在于,当我使用休眠模板保存 User 对象(还包含一个 Address 对象的列表)时,它会插入 null 地址表中外键列("user_id")中的"strong>".

The problem is that when I am saving User object (which also contains list of one Address object) with hibernate template, it is inserting null in foreign key column ("user_id") in address table.

这两个表都触发 2条插入语句,但不触发更新语句来更新外键列

It fires 2 insert statements for both the tables but it is NOT firing update statement to update foreign key column

但是当我使用 SessionFactory 时,它可以正常工作(下面是会话工厂的代码):

But when I use SessionFactory it works as expected (below is the code of session factory):

    SessionFactory factory = template.getSessionFactory();
    Session session = factory.openSession();

    Transaction transaction = session.beginTransaction();       

    try{
        //id = (Integer) template.save(user);
        id = (Integer) session.save(user);
    }catch(Exception e){
        System.out.println(e);
        id = -1;
    }

    transaction.commit();
    session.close();

在上述情况下,它会触发 2次插入和1次更新来更新外键列

In above case it fire 2 insert and 1 update to update foreign key column

推荐答案

请检查下面的映射

User.java

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

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

@Fetch(value = FetchMode.SELECT)
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "id")
@JsonIgnore 
private List<Address> addressList ;

//remaining fields and getter setters here
}

Address.java

@Entity
@Table(name="address")
public class Address {

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


   @ManyToOne
   @JoinColumn(name = "id", insertable = true, updatable = true, nullable = true)
   private User user;

//remaining fields and getter setters here
}

这篇关于Spring Hibernate使用Hibernate模板在外键列中一对多插入null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-22 04:22