我正在尝试使用 Spring 建立一个网站。我已经设法从我设置的数据库中读取数据,但现在在尝试更新其中的行时遇到了问题。我正在merge()
使用EntityManager
. 我没有收到任何错误或异常,它只是不会更新数据库上的数据。
我会尽量给出所有相关的代码。
我要更改的实体类:我已经设法用数据库中的数据填充它,所以我认为应该没问题。
贝努策.java
@Entity
@Table(name = "BENUTZER")
@NamedQueries({
@NamedQuery(name = "Benutzer.findAll", query = "SELECT tt FROM Benutzer tt"),
@NamedQuery(name = "Benutzer.findByKennung", query = "SELECT tt FROM Benutzer tt WHERE tt.kennung = :kennung"),
public class Benutzer {
@Id
@GeneratedValue
private BigInteger oid;
@Size(min = 2, max = 20)
@Pattern(regexp = "[A-Za-z ]*", message = "Titel darf nur Buchstaben und Leerzeichen beinhalten")
private String titel;
@NotNull
@Size(min = 2, max = 25)
@Pattern(regexp = "[A-Za-z ]*", message = "Anrede darf nur Buchstaben und Leerzeichen beinhalten")
private String anrede;
@NotNull
@Size(min = 2, max = 45)
@Pattern(regexp = "[A-Za-z ]*", message = "Name darf nur Buchstaben und Leerzeichen beinhalten")
private String name;
@NotNull
@Size(min = 2, max = 45)
@Pattern(regexp = "[A-Za-z ]*", message = "Vorname darf nur Buchstaben und Leerzeichen beinhalten")
private String vorname;
@NotNull
@Size(min = 6, max = 16)
@Pattern(regexp = "[0-9]*", message = "Telefonnummer darf nur aus Zahlen bestehen")
private String telefonnummer;
@Size(max = 25, message = "Fax darf maximal 25 Zahlen beinhalten")
@Pattern(regexp = "[0-9]*", message = "Fax darf nur aus Zahlen bestehen")
private String fax;
@NotNull
@Size(min = 2, max = 45)
@Pattern(regexp = "[A-Za-z0-9 ]*", message = "Straße darf nur Buchstaben, Leerzeichen und Hausnummer beinhalten")
private String strasse;
@NotNull
@Size(min = 2, max = 45)
@Pattern(regexp = "[A-Za-z0-9 ]*", message = "Ort darf nur Buchstaben, Leerzeichen und PLZ beinhalten")
private String ort;
@NotNull
@Size(min = 2, max = 45, message = "E-mail muss zwischen 2 und 45 Zeichen beinhalten")
private String email;
private boolean freigeschaltet;
@Temporal(TemporalType.TIMESTAMP)
private Date sperrbeginn;
@NotNull(message = "Kennung darf nicht leer sein")
private String kennung;
@NotNull
private String passwort;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "BENUTZER_has_KUNDE", joinColumns = { @JoinColumn(name = "BENUTZER_oid") }, inverseJoinColumns = { @JoinColumn(name = "KUNDE_oid") })
private List<Kunde> kundenListe;
public Benutzer() {
};
+getter and setter
}
}
DAO:我使用其中的update(Benutzer benutzer)
方法尝试更新数据库中的适当列。
BenutzerDaoImpl.java
@Transactional
@Repository("benutzerDao")
public class BenutzerDaoImpl implements BenutzerDao{
private EntityManager em;
public EntityManager getEm() {
return em;
}
@PersistenceContext (type = PersistenceContextType.TRANSACTION)
public void setEm(EntityManager em) {
this.em = em;
}
public Benutzer findById(BigInteger id) {
return em.find(Benutzer.class, id);
}
public Benutzer findByKennung(String kennung) {
Query benutzerByKennung = em.createNamedQuery("Benutzer.findByKennung");
benutzerByKennung.setParameter("kennung", kennung);
return (Benutzer) benutzerByKennung.getSingleResult();
}
public List<Benutzer> findAll() {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Benutzer> criteria = cb.createQuery(Benutzer.class);
Root<Benutzer> benutzer = criteria.from(Benutzer.class);
criteria.select(benutzer).orderBy(cb.asc(benutzer.get("name")));
return em.createQuery(criteria).getResultList();
}
public void register(Benutzer benutzer) {
em.persist(benutzer);
return;
}
public void delete(BigInteger id) {
Benutzer benutzerTemp = findById(id);
em.remove(benutzerTemp);
}
public void update(Benutzer benutzer) {
Benutzer benutzerTemp = findById(benutzer.getOid());
benutzerTemp.setTelefon_vorwahl(benutzer.getTelefon_vorwahl());
benutzerTemp.setTelefon_nummer(benutzer.getTelefon_nummer());
benutzerTemp.setFax_vorwahl(benutzer.getFax_vorwahl());
benutzerTemp.setFax_nummer(benutzer.getFax_nummer());
benutzerTemp.setStrasse(benutzer.getStrasse());
benutzerTemp.setStrasse_nummer(benutzer.getStrasse_nummer());
benutzerTemp.setOrt(benutzer.getOrt());
benutzerTemp.setEmail(benutzer.getEmail());
benutzerTemp.setKennung(benutzer.getKennung());
em.merge(benutzerTemp);
return;
}
}
以及在代码底部调用该update(Benutzer benutzer)
函数的 Controller 类:saveBenutzerdaten()
BenutzerdatenController.java
@Controller
@SessionAttributes("activeUser")
public class LoginController {
private BenutzerDao benutzerDao;
private KundeDao kundeDao;
private AnlageDao anlageDao;
@Autowired
public LoginController(BenutzerDao benutzerDao, KundeDao kundeDao, AnlageDao anlageDao){
this.benutzerDao = benutzerDao;
this.kundeDao = kundeDao;
this.anlageDao = anlageDao;
}
@ModelAttribute("activeUser")
public Benutzer populateActiveUser() {
return new Benutzer(); // Füllt activeUser beim ersten mall wenn es null ist.
}
@RequestMapping(value = "/login" ,method = RequestMethod.GET)
public String login(Model model, SessionStatus status) {
status.setComplete();
model.addAttribute("benutzerLoginDaten", new Login());
return "login";
}
@RequestMapping(value = "/login" ,method = RequestMethod.POST)
public String requestLogin(
@Valid @ModelAttribute("benutzerLoginDaten") Login logindaten,
BindingResult result, Model model, final RedirectAttributes redirectAttributes) {
if (!result.hasErrors()) {
if (logindaten == null) {
String error = "Fehler beim login";
model.addAttribute("error", error);
return "login";
}
Benutzer user = null;
try{
user = benutzerDao.findByKennung(logindaten.getKennung());
}catch(Exception e){
String error = "Unbekannter Benutzer";
model.addAttribute("error", error);
return "login";
}
if (user == null) {
String error = "Unbekannter Benutzer";
model.addAttribute("error", error);
return "login";
}
String pw = user.getPasswort();
if (pw.equals(logindaten.getPasswort())) {
redirectAttributes.addFlashAttribute("activeUser", user);
return "redirect:/home.html";
} else {
String error = "Passwort falsch";
model.addAttribute("error", error);
return "login";
}
}
return "login";
}
@RequestMapping(value = "/home",method = RequestMethod.GET)
public String home(@ModelAttribute("activeUser") Benutzer activeUser ,Model model, final RedirectAttributes redirectAttributes){
if(activeUser == null){
return "redirect:/login.html";
}
if(activeUser.getKennung()==null){
//falls activeUser == null, hat sich kein Benutzer eingelogt
//und wird damit auf die loginseite weitergeleitet.
return "redirect:/login.html";
}
//erstellen der Anlagenliste mit dazugehörigem Kunden:
//i und j werden zum mitzählen der schleifendurchläufe verwenden
//sum zählt die benotigte größe für die Anlagenliste. (summe der anlagen aller kunden zu denen der benutzer zugriff hat)
int i=0, j = 0, sum = 0;
List<Kunde> kunden = activeUser.getKundenListe();
for(i = 0 ; i< kunden.size(); i++){
List<Anlage> anlagen = kundeDao.getAllAnlagen(kunden.get(i));
sum += anlagen.size();
}
//auffüllen der attribute für select anlagenListe (beschreibung: anlagenbeschreibung, ids: anlagenids):
String[] beschreibung = new String[sum];
BigInteger[] ids = new BigInteger[sum];
Select anlagenListe = new Select();
sum = 0;
for(i = 0 ; i < kunden.size(); i++){
List<Anlage> anlagen = kundeDao.getAllAnlagen(kunden.get(i));
for(j = 0; j <anlagen.size(); j++){
//beschreibung format : Anlagenbezeichnung (kunde)
beschreibung[sum] =
""+anlagen.get(j).getBezeichnung() +
" (" +
((kunden.get(i).isFirma())?
kunden.get(i).getFirmenname()
:
kunden.get(i).getPrivatperson_nachname() +
" " +
kunden.get(i).getPrivatperson_vorname()) +
")";
ids[sum++]= anlagen.get(j).getOid();
}
}
anlagenListe.setSelectOptions(beschreibung);
anlagenListe.setIds(ids);
model.addAttribute("activeUser", activeUser);
model.addAttribute("selection", anlagenListe);
return "home";
}
@RequestMapping(value = "/home", method = RequestMethod.POST)
public String selectAnlage(@Valid @ModelAttribute("selection") Select selection, BindingResult result, Model model) {
if(!result.hasErrors()) {
Anlage anlage = anlageDao.findById(selection.getSelectionOid());
System.out.println("anlage-- id: " + anlage.getOid() + " Bezeichnung: " + anlage.getBezeichnung());
return "home";
}
return "home";
}
@RequestMapping(value = "/benutzerdaten", method = RequestMethod.GET)
public String benutzerdaten(@ModelAttribute("activeUser") Benutzer benutzer,Model model){
return "benutzerdaten";
}
@RequestMapping(value = "/benutzerdaten", method = RequestMethod.POST)
public String saveBenutzerdaten(
@ModelAttribute("activeUser") Benutzer benutzer,
Model model) {
benutzerDao.update(benutzer);
return "benutzerdaten";
}
}
我一直在寻找解决方案很长一段时间,我也发现很多人有类似的问题,但他们的解决方案都不适合我。我真的希望有人能找到问题所在。开始变得非常沮丧。只需询问您是否需要查看更多代码或相关数据。
另外,如果您发现我应该更改任何内容,请告诉我。我是 Spring 的新手,不确定我做的一切是否正确。尤其是我处理登录用户的方式(可能不是将他保存在 DAO 对象中的好解决方案?)。
我找到了解决方案。在我添加一个服务类并添加到我的 mvc-dispatcher-servlet.xml 之后它工作正常。(sopro.mvc.swm.service 是我的服务类所在的包)。