1

Policy と Acl の 2 つのクラスがあります。それらには、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>();
}

カスケード型を永続化として使用すると、次のエラーが発生しました。

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

一方、カスケード タイプをすべて使用すると、ポリシー エンティティと 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();
    }
4

1 に答える 1

3

session.persist()の代わりに使用session.save()

明確な詳細については、休止状態のドキュメントを参照してください。

1)セッション.persist():

一時インスタンスを永続化します。関連付けがcascade="persist"でマップされている場合、この操作は関連付けられたインスタンスにカスケードします 。

2)セッション.save():

最初に生成された識別子を割り当てて、指定された一時インスタンスを永続化します。(または、割り当てられたジェネレーターが使用されている場合は、identifier プロパティの現在の値を使用します。) 関連付けがcascade="save-update"でマップされている場合、この操作は関連付けられたインスタンスにカスケードされます。

于 2015-04-29T12:37:36.717 に答える