簡體   English   中英

hibernate - 級聯類型持久存在多對多的關系

[英]hibernate - cascading type persist for many to many relationship

我有兩個類策略和Acl。 他們之間有一個ManyToMany關系。

//政策

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",joinColumns=@JoinColumn(name = "POLICY_ID"),
                                    inverseJoinColumns=@JoinColumn(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>();
}

現在,當我使用Cascade類型作為持久性時,我得到以下錯誤:

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類型作為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();
    }

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

有關詳細信息,請參閱hibernate文檔:

1) Session.persist():

使瞬態實例持久化。 如果使用cascade =“persist”映射關聯,則此操作會級聯到關聯的實例

2) Session.save():

保留給定的瞬態實例,首先分配生成的標識符。 (或者,如果使用指定的生成器,則使用identifier屬性的當前值。)如果使用cascade =“save-update”映射關聯,則此操作會級聯到關聯的實例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM