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

时间:2013-10-04 18:55:20

标签: java hibernate jpa hibernate-mapping

我正在创建用户个人资料,用户可以在其中输入他们感兴趣的预定义列表用户无法从此列表中选择。

我有分别包含主键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

这是我的代码

User.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 -----

Intrest.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 -----

ActionClass.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 -----

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

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

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 (?)

查询。

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

2 个答案:

答案 0 :(得分:3)

问题不在于休眠,而在于你的代码..如果你正在做new Interest(..),hibernate会将它们保存在数据库中,你应该做类似的事情:

public class MyAction extends ActionSupport {
    private Long[] interestIds;

    public String execute() {

        // get interests with ids
        // set interests to user
        // save user

    }

}

答案 1 :(得分:-1)

首先,你必须确保你有感兴趣的Getter和Setter,如果你错过了#34; IDE没有显示警告&#34;你必须添加它们。

然后你必须这样做

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