我有实体:
@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 将使用更新。为什么?
我使用 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;
}
Controller :
@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),因此会发布更新。
关于java - Hibernate:更新而不是插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40591566/