如何防止休眠在多对多映射中插入到一个表中



我正在创建用户配置文件,用户可以在其中输入他们的兴趣,其中的兴趣是预定义的列表用户不能从此列表中选择。

我有分别带有主键userIdinterestId的用户和兴趣表。

             Table:User
-------------------------------------
        userId      userName
          1            aaaa
          2            bbbb
          3            cccc

           Table:Intrest
-------------------------------------
      interestId    interestName
          1            Sports
          2            Reading
          3            Music

对多映射表

         Table:UserIntrest
-------------------------------------
        userId    interestId
          1            1
          1            2
          1            3

这是我的代码

用户.java

@Entity
public class User {
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long userId;
    private String username;
    private String password;
    @ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
        name="UserIntrest",
        joinColumns={ @JoinColumn(name="userId",referencedColumnName="userId") },
        inverseJoinColumns={ @JoinColumn(name="intrestId", referencedColumnName="intrestId") }
        )
    private List<Intrest> intrestList;
    ----- Getters Setters -----

英特雷斯特.java

@Entity
@Table(name="intrest")
public class Intrest {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int intrestId;
    private String intrestName;
    public Intrest(String name){
        this.intrestName = name;
    }
----- Getters & Setters -----

动作类.java

public class ActionClass extends ActionSupport {

    private User user;
    private List<String> intrestList;//for get list of intrest from jsp select tag
    private List<Intrest> intrestLst = new ArrayList<Intrest>();
    public String execute(){
        for(int i = 0;i<intrestList.size();i++){
            System.out.print(intrestLst.add(new Intrest(intrestList.get(i))));
        }
        user.setIntrestList(intrestLst);
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session session = sf.getCurrentSession();
        session.beginTransaction();
        session.save(user);
        session.getTransaction().commit();

        return SUCCESS;
    }
    ----- Getters & Setters -----

所以当我运行它时,它会在用户表中插入用户,在兴趣表中选择兴趣,并在用户兴趣表中映射

一切正常,但我不需要在兴趣表中插入兴趣,因为我已经插入了所需的兴趣。

Hibernate: insert into User (password, username) values (?, ?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)
Hibernate: insert into UserIntrest (userId, intrestId) values (?, ?)

我不想执行

Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)
Hibernate: insert into intrest (intrestName) values (?)

查询。

我搜索了很多这个问题,但我找不到任何解决方案。

问题不在于休眠,而在于您的代码.. 如果你正在做new Interest(..),休眠会把它们持久化在数据库中,你应该做这样的事情:

public class MyAction extends ActionSupport {
    private Long[] interestIds;
    public String execute() {
        // get interests with ids
        // set interests to user
        // save user
    }
}

首先,您必须确保具有 getter 和 setter for interestId ,如果您错过了"IDE 不显示警告",则必须添加它们。

那你必须这样做

@Entity
class user{
@ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE})
@JoinTable(name="user_interest",joinColumns= {@JoinColumn(name="user_id", referencedColumnName = "id")},inverseJoinColumns= {@JoinColumn(name="interest_id", referencedColumnName = "id")})
private Set<Interest> interests= new HashSet<>();
 .
 .
 }
@Entity
@JsonIgnoreProperties({"users"})
class interest{
@ManyToMany(mappedBy="interests")
private List<User> users;
}

最新更新