2016-11-14 194 views
0

我有实体:休眠:更新,而不是插入

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

如果用户列表lessonList为空Hibernate在BD中插入NEW用户。如果列表不为空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; 
} 

控制器:

@Transactional 
    void copyUser(HttpServletRequest request, HttpServletResponse response) { 

       User copyUser = getUserFromXML(idUser);// it get from Client 
       copyUser.setParentid(getLoginUser()); 
       userDAO.save(copyUser); 

     } 
    } 
+1

向我们展示您用来测试它的休眠日志和实际代码。 – Antoniossss

+0

@Antoniossss我添加了代码 – Sergei

回答

2

你指定的对象ID自动分配。如果你自己提供了一个ID,Hibernate猜测你已经保存了该实体(所以你知道这个ID),并且因此发布了一个更新。

+0

但是,如果列表为空,那么我可以制作多份副本。有什么不同? – Sergei