2013-05-12 56 views
0

我在休眠中試驗延遲加載實體,但無法克服上述錯誤。我基本上有2個實體玩:用戶和角色:保存懶惰的孩子導致:TransientObjectException:對象引用未保存的瞬態實例 - 在沖洗前保存瞬態實例

public class User implements Serializeable { 
    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "T_USER_ROLE", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "ROLE_ID")) 
    private Set<Role> roles = new HashSet<Role>(); 
} 

public class Role implements Serializeable { } 

然後,我有一個動作的bean創建用戶實體,我們稱這種方法1:

user.getRoles().add(roleService.findByName(RolesEnum.ADMIN.toString())); 
em.persist(user); 

然後我試着堅持用戶第一實體設置的角色和更新前,但它也失敗:

userService.create(user); 
User user = userService.findById(user.getId()); 
Set<Role> roles = new HashSet<Role>(); 
roles.add(roleService.findByName(RolesEnum.MEMBER.toString())); 
user.setRoles(roles); 
userService.update(user, true); 

需要注意的是:

  • userService.create =堅持
  • userService.update =合併
  • 成員角色已存在於角色表
  • 我也試圖獲取角色:entity.getRoles();

下面是完整的錯誤日誌:

java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.test.Role org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1374) 

回答

0

此問題是由實體管理器結合談話範圍和使用縫焊解決。

@Qualifier 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) 
public @interface TempJpa { } 

@ExtensionManaged 
@ConversationScoped 
@Produces 
@PersistenceUnit(unitName="tempDataSource") 
@TempJpa 
private EntityManagerFactory emf; 

@Inject 
@TempJpa 
protected EntityManager em; 

但是接下來的問題是爲什麼?

相關問題