我正在尝试使用Spring建立一个网站。
我已经设法从我设置的数据库中读取数据,但现在在尝试更新其中的行时遇到了问题。我正在使用merge()
的{{1}}功能。
我没有得到任何错误或例外,它只是不会更新数据库上的数据。
我会尝试提供所有相关代码。
我想要更改的实体类: 我已经设法用DB中的数据填充它,所以我认为它应该没问题。
Benutzer.java
EntityManager
DAO:我在其中使用@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
}
}
方法尝试更新数据库中的适当列。
BenutzerDaoImpl.java
update(Benutzer benutzer)
Controller类在代码底部的@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)
函数:
BenutzerdatenController.java
saveBenutzerdaten()
我一直在寻找解决方案已有很长一段时间了,而且我也发现很多人都有类似的问题,但他们的解决方案都不适合我。我真的希望有人发现问题。开始变得非常沮丧。请问如果您需要查看更多代码或相关数据。
另外,如果您发现我应该更改的内容,请告诉我。我是Spring的新手,不确定我做的一切都是正确的。特别是我处理登录用户的方式(可能不是将他保存在DAO对象中的好方法吗?)。
我找到了解决方案。添加服务类并添加到我的mvc-dispatcher-servlet.xml后,它工作正常。 (sopro.mvc.swm.service是我有我的服务类的包。)
答案 0 :(得分:0)
请尝试以下操作:
在控制器中尽量不要将用户private Benutzer currentlyActive
作为即时变量。
至少在saveBenutzer方法中不使用currentActive对象,而是从模型属性@ModelAttribute("newBenutzerdaten") Benutzer benutzerdaten
中检索对象id。将id存储在网页中的某个隐藏变量中,以便它可以在modelAttribute中使用,并将此modelAttribute直接传递给update方法。
答案 1 :(得分:0)
你发布了很多代码,我相信你可以很容易地将其删除,以提供一个显示问题的最小例子。但是,您没有发布配置。
经常遇到的一个问题是@Transactional
可能在Spring MVC上下文中不起作用,而当然@Controller
不能在一个上面工作。请参阅https://stackoverflow.com/a/19388280/2621917中的答案,该答案可能相关或不相关。
答案 2 :(得分:0)
我找到了解决方案。添加服务类并添加后,它工作正常 到我的mvc-dispatcher-servlet.xml,以及applicationContext.xml。 (sopro.mvc.swm.service是我有我的服务类的包。)
谢谢大家:)