【问题标题】:DataNucleus many-many attributed relation. Relation object deleted after removal from related objectsDataNucleus 多对多属性关系。从相关对象中删除后删除的关系对象
【发布时间】:2018-04-26 21:27:00
【问题描述】:

基于此处的示例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 关系。

公司.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();

从相关对象中删除关系对象,提交后自动删除关系对象。如果我想将它重新添加到相关对象中,我将无法再次访问它。 我在这里做错了什么?

【问题讨论】:

  • 我不确定具体的实现,但是关系对象在概念上并不存在,除非在它连接的另外两个对象的上下文中。如果你将它从它的一个或两个对象中分离出来,它就不再具有任何意义,并且设计良好的 ORM 将有理由删除它,否则你会在数据库中留下无用的垃圾。如果您需要重新创建它,则必须保存关系对象的状态(其内部值与关系本身有关)并在需要时重新创建它。
  • 显然 JDO 定义了删除事物时的语义,或从关系中删除对象以防止孤儿。你有一个 LOG 告诉你在数据库通信方面发生了什么;你似乎没有在看那个......
  • 谢谢,@Jim @DN1。我一直在考虑这个自动删除。当关系的伴侣退出时,关系将不复存在。这是常识,这就是为什么删除它是合理的。但是应用程序身份的问题,当对象被删除时,应用程序将不再使用密钥id。有没有什么用尽键号分配之类的?

标签: java jdo datanucleus


【解决方案1】:

我能够通过添加 dependentdependent-element 属性并将其设置为 false 来解决自动删除的问题。我更新了我的代码如下;

公司.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; 
...

【讨论】:

  • 没有。您被告知 JDO 已经为删除关系时发生的事情定义了语义。您尚未检查/定义这些如何适用于您的案例。这就是 LOG 显示的内容
  • 能否给我一个链接,以便我更新我的知识。如果不从相关对象中删除关系,例如cust1.removeRelation(rel);,我不知道如何以及在这里定义什么。谢谢。
  • 我原以为 JDO 提供者的文档是从哪里开始的。删除依赖和其他这样的选项,当然还有LOG,但已经提到...
  • @DN1。是的。我通过将dependentdependent-element 添加并设置为false 得到了它。但是这里有一个问题,关系对象上的相关对象上的字段值为空。为了识别这个特定的关系对象,我需要添加第二个 id 或从相关对象 id 派生的键,例如复合 id,因为我使用的是应用程序标识。你怎么看?
  • 不知道你在说什么。建议你用代码重写你的问题,什么是“null”
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多