![](/img/trans.png)
[英]How to save data with unique field in many-to-many relationship using JPA and Hibernate
[英]How to save data from multiple select tag in jsp page to DB using Hibernate many-to-many
我想使用hibernate映射将用户保存到数据库中: 多对多
POJO的:
@Entity
@Table(name = "users_db")
public class Users implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_user", unique = true, nullable = false)
private long id;
@Column(name = "userName_db")
private String userName;
@Column(name = "email_db")
private String Email;
private String password;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "userskill", joinColumns = {
@JoinColumn(referencedColumnName = "id_user", nullable = false) }, inverseJoinColumns = {
@JoinColumn(referencedColumnName = "id") })
private Set<Skills> skills = new HashSet<Skills>();
// getters ans setters
@Entity
@Table(name = "skillsDB", uniqueConstraints = @UniqueConstraint (columnNames ="typeSkill") )
public class Skills implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "typeSkill")
private String typeSkill;
@ManyToMany(mappedBy = "skills")
private Set<Users> users = new HashSet<Users>();
// getters and setters
addUserServlet.java
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
UserService userService = new UserServiceImpl();
Users user = new Users();
user.setUserName(request.getParameter("UserName"));
user.setEmail(request.getParameter("Email"));
user.setPassword(request.getParameter("Password"));
Set<Skills> skillSet = new HashSet<Skills>();
for (int i = 0; i < request.getParameterValues("skills").length; i++) {
skillSet.add(new Skills(request.getParameterValues("skills")[i]));
}
user.setSkills(skillSet);
userService.add(user);
request.setAttribute("usersList", userService.showUsers());
this.getServletContext().getRequestDispatcher("/addUser.jsp").forward(request, response);
}
用户DAOImpl.java
public List<Users> showUsers() {
List<Users> result = session.createCriteria(Users.class).list();
return result;
}
休眠配置
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/dictionnaire</property>
<property name="connection.username">root</property>
<property name="connection.password">mosab</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="use_sql_comments">true</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- Names the annotated entity class -->
<mapping resource="com.entity.Users" />
<mapping resource="com.entity.Skills" />
</session-factory>
addUser.jsp
在选择标签中,我从数据库中获取数据
<form action="adduser" method="post">
<table>
<tr>
<td><label for="name">User name :* </label></td>
<td><input type="text" name="UserName" /></td>
</tr>
<tr>
<td><label for="Email">Email :* </label></td>
<td><input type="text" name="Email" /></td>
</tr>
<tr>
<td><label for="Password">Password :*</label></td>
<td><input type="password" name="Password" /></td>
</tr>
<tr>
<td><label for="skills">skills :</label></td>
<td><select name="skills" multiple="multiple">
<c:forEach var="item" items="${skills }">
<option value="${item.typeSkill}" ><c:out value="${item.typeSkill}"/></option>
</c:forEach>
</select></td>
</tr>
<tr>
<td><input type="submit" name="Save" /></td>
</tr>
</table>
</form>
<table>
<thead>
<tr>
<th>Id User</th>
<th>User name</th>
<th>password</th>
<th>email</th>
<th>Skills</th>
</tr>
</thead>
<tbody>
<c:forEach var="item" items="${usersList}">
<tr>
<td><c:out value="${item.id}" /></td>
<td><c:out value="${item.userName}" /></td>
<td><c:out value="${item.password}" /></td>
<td><c:out value="${item.email}" /></td>
<td><c:out value="${item.skills}" /></td>
</tr>
</c:forEach>
</tbody>
</table>
问题:当我填写输入内容并选择一些技能时,提交后,在表格中我成功获得了ID,名称,电子邮件,密码,但是技能类似:
如果我选择一项技能: [com.entity.Skills@60b7080b]
如果我选择两个技能: [com.entity.Skills @ 60b7080b,com.entity.Skills @ 5e0659ab]
因此,我希望这对您来说很清楚。
谢谢Dragan Bozanovic的帮助,但我自己找到了解决方案:
<c:forEach var="item" items="${usersList}">
<tr>
<td><c:out value="${item.id}" /></td>
<td><c:out value="${item.userName}" /></td>
<td><c:out value="${item.password}" /></td>
<td><c:out value="${item.email}" /></td>
<td><c:forEach var="skill" items="${item.skills}">
<c:out value="${skill.typeSkill}"/>
</c:forEach></td>
</tr>
</c:forEach>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.