0

私はかなり混乱しています。次のコードを使用して、データベースに 2 つの Customers が作成されている理由を見つけようとしていますが、うまくいきません。コードからすべてのノイズをカットしようとしましたが、問題の解決に重要なものを消去していないことを願っています。ここでは次の順序で表示されます: エンティティ、DAO、サービス、および偽の動作を保持するspecialTreatmentを持つSpecialService

specialTreatmentの目的は、Customer がリンクされていない既存の Order を取得し、新しい Customer を作成して、それを Order に関連付けることです。

エンティティ :

Order.java :

@Entity
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "pk_id_order")
    private Integer id;

    // Other fields ...

    @BatchFetch(value = BatchFetchType.IN)
    @JoinColumn(name = "fk_id_customer", referencedColumnName = "pk_id_customer")
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private Customer customer;

    // Other fields ...

    // Getter & setters for each field

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 79 * hash + (this.id != null ? this.id.hashCode() : 0);

        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || !(obj instanceof Order)) {
            return false;
        }

        final Order other = (Order) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }

        return true;
    }
}

Customer.java :

@Entity
public class Customer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "pk_id_customer")
    private Integer id;

    // Other fields

    @OrderBy(value = "createdAt DESC")
    @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY)
    private List<Order> orders;

    @Override
    public int hashCode() {
        return (id != null ? id.hashCode() : 0);
    }

    @Override
    public boolean equals(Object object) {
        if (object == null || !(object instanceof Customer)) {
            return false;
        }

        final Customer other = (Customer) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }

        return true;
    }
}

DAO :

@Repository
@Transactional
public class CustomerDao {

    @PersistenceContext
    protected EntityManager em;

    public void create(Customer customer) {
        this.em.persist(customer);
    }
}

@Repository
@Transactional
public class OrderDao {

    @PersistenceContext
    protected EntityManager em;

    public Order edit(Order order) {
        return this.em.merge(order);
    }
}

サービス :

@Service
@Transactional
public class CustomerService {

    @Autowired
    private CustomerDao customerDao;

    public void create(Customer customer) {
        this.customerDao.create(customer);
    }
}

@Service
@Transactional
public class OrderService {

    @Autowired
    private OrderDao orderDao;

    public void edit(Order order) {
        this.orderDao.edit(order);
    }
}

@Service
@Transactional
public class SpecialService {

    @Autowired
    private CustomerService customerService;

    @Autowired
    private OrderService orderService;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void specialTreatment(Order order) {
        Customer customer = new Customer();
        // Fill customer ...

        this.customerService.create(customer); // LINE X

        order.setCustomer(customer); // LINE Y

        this.orderService.edit(order);
    }
}

注 : 行 X にコメントする場合: - 顧客が作成されていない (予想どおり)、注文は予想どおりに編集されます 行 Y にコメントする場合: - 顧客は予想どおりに作成されます (1 行のみ) が、注文にリンクされていません

コードは Spring MVC コントローラーから呼び出されます

何かアドバイス ?

4

0 に答える 0