Как удалить однонаправленное, однозначное сопоставление из базы данных, используя jpa - PullRequest
1 голос
/ 20 октября 2019

Я хочу удалить как строку в таблице Merchant, так и строку в таблице Address из базы данных. Продавец имеет address_id в своей таблице. Я создал DAO для Merchant и Address. Как я могу сделать это, используя только Entity Manager? Я упустил импорт, и геттеры и сеттеры. Кажется, только удалить строку в таблице Merchant, и оставить строку в таблице адресов. Спасибо за любую помощь, спасибо.

Всякий раз, когда я удаляю торговую сущность, она сохраняет идентификатор адреса и не удаляет соответствующий адрес в таблице адресов. Я не понимаю почему.

@Entity
public class Merchant {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @OneToOne
    private Address address;

    public Merchant() {
    }
}
public class MerchantDAO {

    protected static EntityManagerFactory emf = Persistence.createEntityManagerFactory("hamzaspersistenceunit");

    public void persist(Merchant merchant) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(merchant);
        em.getTransaction().commit();
        em.close();
    }

    public void removeMerchant(Merchant merchant) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.remove(em.contains(merchant) ? merchant : em.merge(merchant));

        em.getTransaction().commit();
        em.close();
    }
}

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String streetAddress;
    private String city;
    private String state;
    private String zipCode;

    public Address(String name, String streetAddress, String city, String state, String zipCode) {
        super();
        this.name = name;
        this.streetAddress = streetAddress;
        this.city = city;
        this.state = state;
        this.zipCode = zipCode;
    }

}
public class AddressDAO {
    protected static EntityManagerFactory emf = Persistence.createEntityManagerFactory("hamzaspersistenceunit");

    public AddressDAO() {

    }

    public void persist(Address address) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();
        em.persist(address);
        em.getTransaction().commit();
        em.close();
    }

    public void removeAddress(Address address) {
        EntityManager em = emf.createEntityManager();
        em.getTransaction().begin();

        em.remove(em.contains(address) ? address : em.merge(address));

        em.getTransaction().commit();
        em.close();
    }
}
public class Test {
    public Test() {

        // creating and persisting an addresss
        Address address = new Address("123", "123", "123", "123", "123");
        AddressDAO addressdao = new AddressDAO();
        addressdao.persist(address);

        // creating and persisting a merchant
        Merchant merchant = new Merchant();
        merchant.setName("merchant");
        merchant.setAddress(address);
        MerchantDAO merchantdao = new MerchantDAO();
        merchantdao.persist(merchant);

        // removing merchant
        merchantdao.removeMerchant(merchant);

    }

    public static void main(String[] args) {
        new Test();
    }

}

1 Ответ

1 голос
/ 20 октября 2019

Попробуйте пометить поле address в сущности Merchant с помощью @OneToOne(orphanRemoval = true). По умолчанию для этого параметра установлено значение false, поэтому операция удаления не относится к сущности Address.

Обновление: правильное решение для этой проблемы - использовать @OneToOne(cascade = CascadeType.REMOVE)

...