2015-04-29 4 views
1

У меня есть два класса Policy and Acl. В них есть отношения ManyToMany.hibernate - каскадный тип persist для многих для многих отношений

// Политика

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 

В то время как при использовании каскадный тип, как и все, тогда он успешно сохраняет объект политики и 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():

Persist данного экземпляра переходного, сначала назначая сгенерированный идентификатор. (Или, используя текущее значение свойства идентификатора, если используется назначенный генератор.) Эта операция выполняется каскадными связанные случаи, если ассоциация отображаются с каскадом = «сохранить-обновление»

+0

Я прочитал «CascadeType.PERSIST: означает, что операции save() или persist() каскад относятся к связанным объектам». на http://howtodoinjava.com/2014/09/25/hibernate-jpa-cascade-types/, и можете ли вы рассказать разницу между использованием persist и save –

+0

@FurquanAhmed, Persist не вернет идентификатор, где в качестве сохранения метод возвращает сгенерированный идентификатор. – Chaitanya

+0

не могли бы вы объяснить, как этот эффект каскадирует? –

Смежные вопросы