Hibernate:更新而不是插入

时间:2016-11-14 14:52:37

标签: java hibernate

我有实体:

$form->submit($Request->getContent());

我从BD获得用户并执行xml:

@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
}

接下来,我从这个xml中获取新用户并尝试保存在BD中。

<user>

        <name>123</name>

        <id>35</id>

</user>

如果用户列表课程列表为空,则Hibernate会在BD中插入新用户。如果list不为空,Hibernate使用update。为什么呢?

我使用JAXB

session.save(user);

使用JAXB创建XML

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
        }

控制器:

@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;
}

1 个答案:

答案 0 :(得分:2)

您正在指定自动分配对象ID。如果您自己提供ID,Hibernate猜测您已经保存了该实体(因此您知道了id),因此发布了更新。