gpt4 book ai didi

java - 如何正确地将表单绑定(bind)到@ManyToOne结构并保存到数据库。 Spring MVC、 hibernate

转载 作者:行者123 更新时间:2023-12-01 09:14:40 25 4
gpt4 key购买 nike

我是一名 Java 开发新手,现在使用 Spring-Hibernate 开发用户管理应用程序。我有两个实体用户和电子邮件。用户实体有一个电子邮件字段,它被映射到电子邮件实体作为@ManyToOne。任何电子邮件都可以由多个用户使用。

当我在数据库中为每个新用户保存一个新用户时,我会收到一个新行电子邮件,即使电子邮件表中已存在相同的记录。如何正确进行保存操作以避免Email表中相同记录重复?

User.java

@Entity
@Table(name = "USER")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="ID")
private Long id;
@Column(name = "name")
private String name;
@ManyToOne
@JoinColumn(name = "email_id")
private Email email;
public User(){
}
public Email getEmail() {
return email;
}
public void setEmail(Email email) {
this.email = email;
}
...
}

Email.java

@Entity
@Table(name = "EMAIL")
public class Email implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="ID")
private Long id;
@Column(name = "emailaddress")
private String emailaddress;
@OneToMany (mappedBy = "email", targetEntity=User.class)
private Set<User> user= new HashSet<User>();

public Email() {
}
public Email(String emailaddress) {
this.emailaddress = emailaddress;
}

public String getEmailaddress() {
return emailaddress;
}
public void setEmailaddress(String emailaddress) {
this.emailaddress = emailaddress;
}
...
}

Controller.java

@Transactional
@RequestMapping(value = "/adduser", method = RequestMethod.POST)
public String saveOrder(@ModelAttribute("user") User user, BindingResult result, @RequestParam String action){
emailDAO.create(user.getEmail());
userDAO.create(user);
return "index";
...
}

EmailDAO.java

@Transactional
@Repository
public class EmailDAO{
@Autowired
private SessionFactory sessionFactory;
public Email create(Email email) {
sessionFactory.getCurrentSession().save(email);
return email;
}
}

UserDAO.java

@Transactional
@Repository
public class UserDAO{
@Autowired
private SessionFactory sessionFactory;

public User create(User user) {
sessionFactory.getCurrentSession().save(user);
return user;
}
}

webform.jsp

<form:form action="${formUrl}" method="post" modelAttribute="user">
<form:label path="name" for="appname">username</form:label>
<form:input path="name" id= "appname" cssClass="form-control"/>

<form:label path="email.emailaddress" for="appemail">Email</form:label>
<form:input path="email.emailaddress" id= "appemail"/>
<button type="submit" name="action" value="Add">Save</button>
</form:form>

数据库图表

Database diagram

数据库记录示例

enter image description here enter image description here

最佳答案

那是因为您继续将电子邮件保存为新记录

@Transactional
@RequestMapping(value = "/adduser", method = RequestMethod.POST)
public String saveOrder(@ModelAttribute("user") User user, BindingResult result, @RequestParam String action){
emailDAO.create(user.getEmail()); // Inserting Email as New Record
userDAO.create(user);
return "index";
...
}

并且您在电子邮件实体上没有unique=true

@Column(name = "emailaddress", unique = true)
private String emailaddress;

理想情况下您应该拥有它,这样即使不小心也不会插入重复的电子邮件。

您需要修改EmailDAO

@Transactional
@Repository
public class EmailDAO{
@Autowired
private SessionFactory sessionFactory;

public Email create(Email email) {
sessionFactory.getCurrentSession().save(email);
return email;
}

public Email getEmail(String inputEmail) {
Email email = null;
Query query = sessionFactory.getCurrentSession().createQuery("FROM Email e WHERE e.emailaddress = :email");
query.setString("email", inputEmail);
List emails = query.list();
if(emails != null && emails.size() > 0) {
email = (Email)emails.get(0);
} else {
email = new Email();
email.setEmailAddress(inputEmail);
}
return email;
}
}

然后你获取电子邮件

@Transactional
@RequestMapping(value = "/adduser", method = RequestMethod.POST)
public String saveOrder(@ModelAttribute("user") User user, BindingResult result, @RequestParam String action){
user.setEmail(emailDAO.getEmail(user.getEmail().getEmailAddress())); // Inserting Email as New Record
userDAO.create(user);
return "index";
...
}

关于java - 如何正确地将表单绑定(bind)到@ManyToOne结构并保存到数据库。 Spring MVC、 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40652977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com