我使用Spring 3.2.3,Hibernate 4.2.3和JDK 7。
我有一个简单的实体:
@Entity
public class Language {
@Id
@GeneratedValue
private long id;
@Column(nullable = false, length = 3, unique = true)
private String code;
}
我使用一个带有@Transactional
注解的方法,通过一个带有@Service
注解的类保存了这个实体。该方法使用一个DAO来保存该实体。
sessionFactory.getCurrentSession().save(object);
然后我使用了保存的Language 语言
实体来创建EntityX
,它在一个ManyToOne
关系中使用了它...
lang=new Language();
// ...
languageService.saveLanguage(lang);
e=new EntityX();
// ...
e.setLanguage(lang);
otherService.saveEntity(e);
并且EntityX
被定义为...
@Entity
public class EntityX {
@ManyToOne
@JoinColumn(nullable = false)
private Language language;
// ...
}
我总是遇到异常
Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: somepackage.Language
我尝试使用一些级联定义在EntityX与Language的关系中,正如其他帖子中建议的那样,但是它没有产生任何效果。
如果我通过某些HQL查询通过其code查找并重新加载保存的Language实体,则一切都正常工作,但这远非“好”的解决方案。
不幸的是,org.hibernate.Session的save(...)方法不会返回保存的对象。
有人有任何想法如何解决吗?
@Transactional
方法中。服务方法也是@Transactional
,但它们不需要新的事务,所以我认为会使用现有的事务。我将Language保存为自己的实体,因为我有一个Language实体和许多EntityX,它们每个都使用相同的Language实体。 - t777