JPA @ManyToMany似乎没有更新没有CascadeType的连接表

时间:2014-07-08 22:00:46

标签: java hibernate jpa

我对我在代码中看到的结果感到有些困惑,我不确定这是通过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?或者,我将代码添加到提供商的方式是否存在问题?

2 个答案:

答案 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。因此,在交易结束时,删除了之前添加的联系人。