2015-04-29 126 views
1

我有两个类Policy和Acl。他们有一个ManyToMany关系。hibernate - 级联类型坚持多对多的关系

//政策

public class PolicyEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "POLICY_ID") 
    private int policyId; 
    @Column(name = "POLICY_NAME") 
    private String policyName; 
    @ManyToMany(cascade = CascadeType.PERSIST) 
    @JoinTable(name = "POLICY_ACL",[email protected](name = "POLICY_ID"), 
            [email protected](name = "ACL_ID")) 
    private List<AclEntity> aclList = new ArrayList<AclEntity>(); 
} 

//的Acl

public class AclEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    @Column(name = "ACL_ID") 
    private int aclId; 
    @Column(name = "ACL_NAME") 
    private String aclName; 
    @ManyToMany(mappedBy = "aclList") 
    private List<PolicyEntity> policyList = new ArrayList<PolicyEntity>(); 
} 

现在,当我使用级联型为坚持那么我得到了以下错误:

Hibernate: insert into POLICY (POLICY_NAME, POLICY_ID) values (?, ?) 
Hibernate: insert into POLICY_ACL (POLICY_ID, ACL_ID) values (?, ?) 
Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hibernate.AclEntity 

而当我使用cascade type as all然后它保存策略实体和acl实体成功。我无法理解这是如何发生的。 注意:我只是执行保存操作。

下面是主要代码:

public static void main(String[] args) { 

     PolicyEntity policyEntity = new PolicyEntity(); 
     AclEntity aclEntity = new AclEntity(); 

     //policyEntity.setPolicyId(1); 
     policyEntity.setPolicyName("Policy 3"); 
     //aclEntity.setAclId(1); 
     aclEntity.setAclName("Acl 3"); 

     policyEntity.getAclList().add(aclEntity); 

     Configuration configuration = new Configuration().configure(); 
     StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(). 
     applySettings(configuration.getProperties()); 
     SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build()); 
     Session session = sessionFactory.openSession(); 
     session.beginTransaction(); 

     session.save(policyEntity); 

     session.getTransaction().commit(); 
     session.close(); 
    } 
+0

显示的代码导致此问题 – Chaitanya

+0

我已更新问题 –

+0

已添加答案,请尝试一次 – Chaitanya

回答

2

使用session.persist(),而不是session.save()

参考冬眠细节清晰的文档:

1)Session.persist():

做一个短暂的实例持久化。此操作级联到 相关实例如果关联映射与 级联=“持续”

2)Session.save():

坚持给定的瞬态的实例中,首先分配一个产生 标识符。 (或者使用所述标识符属性的当前值,如果使用 assigned生成。)此操作级联到相关联 实例如果关联与级联映射=“保存更新”

+0

我读“CascadeType.PERSIST:意味着将save()或persist()操作级联到相关的实体。”在http://howtodoinjava.com/2014/09/25/hibernate-jpa-cascade-types/,你可以请告诉使用坚持和保存 –

+0

@FurquanAhmed之间的区别,坚持不会返回一个ID作为保存方法返回生成的ID。 – Chaitanya

+0

你能解释一下这个效果如何级联? –