我正在创建用户配置文件,用户可以在其中输入他们的兴趣,其中的兴趣是预定义的列表用户不能从此列表中选择。
我有分别带有主键userId
和interestId
的用户和兴趣表。
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;
}