我对我在代码中看到的结果感到有些困惑,我不确定这是通过JPA设计,还是我需要进一步挖掘。
鉴于以下实体:
public class Provider implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@ManyToMany
@JoinTable(name = "provider_contact", joinColumns = @JoinColumn(name = "contact_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "provider_id", referencedColumnName = "id"))
@OrderColumn
private List<Contact> contacts;
}
和以下代码(在事务中发生):
/**
* Updates the contact for the provider
* @param providerId
* @param contactDTO
*/
@Override
public Contact addContact(final long providerId, Contact contact){
// first need to find the provider in the db
Provider p = checkNotNull( providerRepository.findOne(providerId) );
// need to save / update the contact if it already exists
contactService.saveContact(contact);
// add the contact to the provider
if( p.getContacts() == null )
p.setContacts(new ArrayList<Contact>());
p.getContacts().add(contact);
// return the contact
return contact;
}
由于我已将联系人添加到提供程序对象这一事实,我希望看到联系人保持联系(基于contactService.saveContact()
)方法,并更新联接表。
但是,provider_contact连接表未更新。
我认为我不需要任何类型的CascadeType
来更新连接表。我错了吗?我是否需要强制执行CascadeType.PERSIST
?或者,我将代码添加到提供商的方式是否存在问题?
答案 0 :(得分:0)
您只保存Contact
而不是保存对提供商所做的更改。
如果您的提供商已映射到您的Contact
,那么您可以这样做:
@Override
public Contact addContact(final long providerId, Contact contact){
// first need to find the provider in the db
Provider p = checkNotNull( providerRepository.findOne(providerId) );
// need to save / update the contact if it already exists
// add the provider to the contact
contact.addProvider(provider)
//save the contact after adding a the provider
Contact contact = contactService.saveContact(contact);
// return the contact
return contact;
}
如果未映射,则需要使用Provider
中的事务方法更新ProviderService
:
@Override
public Contact addContact(final long providerId, Contact contact){
// first need to find the provider in the db
// need to save / update the contact if it already exists
contactService.saveContact(contact);
providerService.updateProvider(long provider, long contact);
// return the contact
return contact;
}
从@ ProviderService
@Override
public Provider updateProvider(long providerId, long contact){
// Get the provider from the service
Provider p = providerService.get(providerId) ;
//get contact from contact Servoce
Contact contact = contactService.getContact(contact);
if( p.getContacts() == null )
p.setContacts(new ArrayList<Contact>());
p.getContacts().add(contact);
// update the provider
return providerRepository.save(p) ;
}
答案 1 :(得分:0)
感谢所有建议。事实证明,代码中的另一个位置有一个连锁(必须真正追踪事物才能找到它)。结束了,我在代码中找错了地方。
另一种方法是意外地将contacts
字段(List<Contact>
)覆盖为null。因此,在交易结束时,删除了之前添加的联系人。