【问题标题】:Update only embedded data without updating everything. Problem with method implementation仅更新嵌入数据而不更新所有内容。方法实现的问题
【发布时间】:2020-09-02 11:12:01
【问题描述】:

我正在学习 Hibernate。我在执行editingAddress 方法时遇到问题。我想在不更新个人数据(姓名、姓氏等)的情况下编辑人员的地址数据。地址已嵌入。

这是我的 POJO 类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "person")
public class Person implements Comparable<Person> {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "name", nullable = false)
    private String name;
    @Column(name = "surname",nullable = false)
    private String surname;
    @Column
    private int age;
    @Column
    private int height;
    @Column
    private double weight;
    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name="street", column = @Column(name="street")),
            @AttributeOverride(name="city", column = @Column(name = "city")),
            @AttributeOverride(name="zipCode",column = @Column(name = "zipCode")),
            @AttributeOverride(name="homeNumber",column = @Column(name="homeNumber"))
    })
    private Address address;


    @Override
    public int compareTo(Person o) {
        int compare = surname.compareTo(o.surname);
        if (compare == 0) {
            compare = name.compareTo(o.name);
        }
        return compare;
    }

}

这是editAddress方法Hibernate的实现:

@Override
    public int editAddress(Person person) {
        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        try {
            transaction = session.beginTransaction();
            Address address = person.getAddress();
            session.update(address);
            transaction.commit();
        } catch (RuntimeException e) {
            if (transaction != null && transaction.isActive()) {
                transaction.rollback();
            }
        }
        session.close();
        return person.getId();

PersonService 方法:

public void editAddress(Person person){
        personDaoHibernate.editAddress(person);

    }

和 AppMenu:

 case EDIT_ADDRESS:
                            System.out.println("Please enter ID of Person which address will be edited:");

                            int idEdit = scanner.nextInt();
                            Optional<Person> found = personService.findById(idEdit);
                            Person person2 = found.get();
                            System.out.println("ADDRESS - city:");
                            String city = scanner.next();
                            System.out.println("ADDRESS - zipCode:");
                            String zipCode = scanner.next();
                            System.out.println("ADDRESS - street:");
                            String street = scanner.next();
                            System.out.println("ADDRESS - home number:");
                            int homeNumber = scanner.nextInt();
                            scanner.nextLine();
                            Address address = new Address(city, zipCode, street, homeNumber);

                            person2.setAddress(address);
                            personService.editAddress(person2);
                            System.out.println(person2);
                            break;

它正在更改新地址的地址,但不保存此更改。我错过了什么? 抱歉所有错误 - 我只是初学者......;)

【问题讨论】:

  • 记录您在editAddress中捕获的异常。我假设您需要更新此人而不是 session.update(address)。

标签: java database hibernate implementation


【解决方案1】:

它丢失了: personDaoHibernate.edit(person); 在 PersonService 方法中。

public void editAddress(Person person){
        personDaoHibernate.editAddress(person);
        personDaoHibernate.edit(person);

现在可以了! ;)

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2013-12-26
    • 2010-11-23
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多