[英]Hibernate: update instead insert
我有實體:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name", nullable = false)
private String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parentid", cascade=CascadeType.ALL)
private List<Lesson> lessonList = new ArrayList<>();
....setters/getters
}
我從BD獲取用戶並執行xml:
<user>
<name>123</name>
<id>35</id>
</user>
接下來,我從該xml中獲取新用戶,並嘗試保存在BD中。
session.save(user);
如果列表教訓用戶列表為空,則Hibernate將新用戶插入BD。 如果列表不為空,則Hibernate使用update。 為什么?
我用的是JAXB
User.class
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Column(name = "name", nullable = false)
private String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "parentid", cascade=CascadeType.ALL)
private List<Lesson> lessonList = new ArrayList<>();
....setters/getters
}
用JAXB創建XML
@Transactional
public User getUserFromXML(int id) {
StringWriter stringWriter = new StringWriter();
User copyUser = null;
User user = UserDAO.getById(id);
try {
JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.marshal(user, stringWriter);
StringReader stringReader = new ringReader(stringWriter.toString());
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
copyUser = (User) unmarshaller.unmarshal(stringReader);
} catch (JAXBException e) {
e.printStackTrace();
}
return copyUser;
}
控制器:
@Transactional
void copyUser(HttpServletRequest request, HttpServletResponse response) {
User copyUser = getUserFromXML(idUser);// it get from Client
copyUser.setParentid(getLoginUser());
userDAO.save(copyUser);
}
}
您正在指定對象ID是自動分配的。 如果您自己提供一個ID,則Hibernate猜測您已經保存了該實體(因此您知道id),因此發出了更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.