DataNucleus многие-многие связывают. Объект отношений удален после удаления из связанных объектов - PullRequest
0 голосов
/ 27 апреля 2018

На основе этого примера здесь https://github.com/datanucleus/samples-jdo/blob/master/many_to_many_attributed/src/main/java/org/datanucleus/samples/jdo/many_many_attributed2/Main.java, Я создал отношение CompanyProduct со следующими кодами.

Company.java

@PersistenceCapable(identityType = IdentityType.APPLICATION, cacheable = "false", detachable = "true")
public class Company implements Serializable {
...
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
long id;
@Persistent
private String name = null;
@Persistent(defaultFetchGroup = "true", mappedBy = "company")
private Set<CompanyProduct> companyProduct = new HashSet<>(); 
...
}

Product.java

@PersistenceCapable(identityType = IdentityType.APPLICATION, cacheable = "false", detachable = "true")
public class Product implements Serializable {
...
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
long id;
@Persistent
private String name = null;
@Persistent(defaultFetchGroup = "true", mappedBy = "product")
private Set<CompanyProduct> companyProduct = new HashSet<>(); 
...
}

CompanyProduct.java

@PersistenceCapable(identityType = IdentityType.APPLICATION, cacheable = "false", detachable = "true")
public class CompanyProduct implements Serializable {
...
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
long id;
@Persistent
private String name = null;
@Persistent(defaultFetchGroup = "true")
private Company company;
@Persistent(defaultFetchGroup = "true")
private Product product; 
...
}

Main.java

...
tx.begin();
CompanyProduct companyProduct = new CompanyProduct();
Company company = pm.getObjectById(Company.class, companyId);
Product product= pm.getObjectById(Product.class, productId);

companyProduct.setCompany(company);
companyProduct.setProduct(product);

company.addCompanyProduct(companyProduct);
product.addCompanyProduct(companyProduct);

pm.makePersistent(companyProduct);
tx.commit();

...

Удаление отношения

tx.begin();
CompanyProduct comProd= pm.getObjectById(CompanyProduct.class, companyProduct.getId());

comProd.removeCompanyProduct(comProd);
comProd.removeCompanyProduct(comProd);

pm.makePersistent(comProd);
tx.commit();

При удалении объекта отношения из связанных объектов автоматически удаляется объект отношения после фиксации. Я не смог бы получить доступ к нему снова, если я хочу повторно добавить его к связанным объектам. Что я тут не так делаю?

1 Ответ

0 голосов
/ 27 апреля 2018

Я смог решить эту проблему автоматического удаления, добавив и установив атрибуты зависимый и зависимый элемент в false. Я обновил свой код следующим образом:

Company.java

...
@Persistent(defaultFetchGroup = "true", mappedBy = "company", dependentElement = "false")
private Set<CompanyProduct> companyProduct = new HashSet<>(); 
...

Product.java

@Persistent(defaultFetchGroup = "true", mappedBy = "product", dependentElement = "false")
private Set<CompanyProduct> companyProduct = new HashSet<>(); 

CompanyProduct.java

...
@Persistent(defaultFetchGroup = "true", dependent = "false")
private Company company;
@Persistent(defaultFetchGroup = "true", dependent = "false")
private Product product; 
...
...