🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 10.2\. 使对象持久化 Hibernate认为持久化类(persistent class)新实例化的对象是_瞬时(Transient)_的。 我们可通过将瞬时(Transient)对象与session关联而把它变为_持久(Persistent)_的。 ``` DomesticCat fritz = new DomesticCat(); fritz.setColor(Color.GINGER); fritz.setSex('M'); fritz.setName("Fritz"); Long generatedId = (Long) sess.save(fritz); ``` 如果`Cat`的持久化标识(identifier)是`generated`类型的, 那么该标识(identifier)会自动在`save()`被调用时产生并分配给`cat`。 如果`Cat`的持久化标识(identifier)是`assigned`类型的,或是一个复合主键(composite key), 那么该标识(identifier)应当在调用`save()`之前手动赋予给`cat`。 你也可以按照EJB3 early draft中定义的语义,使用`persist()`替代`save()`。 此外,你可以用一个重载版本的`save()`方法。 ``` DomesticCat pk = new DomesticCat(); pk.setColor(Color.TABBY); pk.setSex('F'); pk.setName("PK"); pk.setKittens( new HashSet() ); pk.addKitten(fritz); sess.save( pk, new Long(1234) ); ``` 如果你持久化的对象有关联的对象(associated objects)(例如上例中的`kittens`集合) 那么对这些对象(译注:pk和kittens)进行持久化的顺序是任意的(也就是说可以先对kittens进行持久化也可以先对pk进行持久化), 除非你在外键列上有`NOT NULL`约束。 Hibernate不会违反外键约束,但是如果你用错误的顺序持久化对象(译注:在pk持久化之前持久化kitten),那么可能会违反`NOT NULL`约束。 通常你不会为这些细节烦心,因为你很可能会使用Hibernate的 _传播性持久化(transitive persistence)_功能自动保存相关联那些对象。 这样连违反`NOT NULL`约束的情况都不会出现了 - Hibernate会管好所有的事情。 传播性持久化(transitive persistence)将在本章稍后讨论。