【问题标题】:How to save new entity which contains another already exists in database by CrudRepository?如何通过 CrudRepository 保存包含另一个已存在于数据库中的新实体?
【发布时间】:2017-08-30 15:22:18
【问题描述】:

我正在尝试使用 json 将一些数据添加到数据库中:

{
    "id": null,
    "basicInfo": {
        "firstName": "Mistral",
        "lastName": "Castrol",
        "pesel": "45789623456",
        "startDate": "2017-02-12"
    },
    "contactInfo": {
        "id": null,
        "email": "wp@pw.pl",
        "phoneNumber": "456789123",
        "address": {
            "houseNamber": 53,
            "apartmentNumber": 25,
            "street": {
                "id": 1,
                "name": "Koszmarna",
                "city": {
                    "id": 2,
                    "name": "Radzyń Podlaski",
                    "voivodeship": {
                        "id": 2,
                        "name": "mazowieckie"
                    },
                    "zipCode": "21-307"
                }
            }
        }
    },
    "bornInfo": {
        "id": null,
        "bornDate": "2018-02-14",
        "city": {
            "id": 1,
            "name": "Siedlce",
            "voivodeship": {
                "id": 1,
                "name": "śląskie"
            },
            "zipCode": "21-307"
        }
    }
}

。我正在失去耐心。经过数小时的谷歌搜索和尝试,我陷入了这个错误:

“消息”:“传递给持久化的分离实体:pl.dn.model.placeInfo.City;嵌套异常是 org.hibernate.PersistentObjectException:传递给持久化的分离实体:pl.dn.model.placeInfo.City”

问题是城市实体(分离)已经存在于数据库中,但另一个数据,如名字,第二个是临时实体的一部分。我不知道我应该 修改 json 或模型。

型号:

版主

@Entity
public class Moderator {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Embedded
    private BasicInfo basicInfo;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "contact_info_id")
    private ModeratorContactInfo contactInfo;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "born_info_id")
    private ModeratorBornInfo bornInfo;

}

版主联系信息

@Entity
@Table(name = "moderator_contact_info")
public class ModeratorContactInfo {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String email;

    @Column(name = "phone_number")
    private String phoneNumber;

    @Embedded
    private Address address;

}

地址

@Embeddable
public class Address {

    @Column(name = "house_number")
    private long houseNamber;

    @Column(name = "apratment_number")
    private long apartmentNumber;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "street_id")
    private Street street;

}

街道

@Entity
public class Street {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "city_id")
    private City city;

}

城市

@Entity
@Table(name = "city")
public class City {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "voivodeship_id")
    private Voivodeship voivodeship;

    @Column(name = "zip_code", length = 6)
    private String zipCode;
}

@Entity
public class Voivodeship {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

}

最后是Controller方法:

@RequestMapping(value = "add", method = RequestMethod.POST)
    public String addModerator(@RequestBody Moderator moderator) {

        return moderatorDao.save(moderator).toString();

    }

临时解决方案:

如果我从数据库加载城市并将其设置为用户,它可以工作,但我必须与主持人中的所有实体有关。

@RequestMapping(value = "add", method = RequestMethod.POST)
    public String addModerator(@RequestBody Moderator moderator) {

        long bornCityId = moderator.getBornInfo().getCity().getId();
        long contactCityId = moderator.getContactInfo().getAddress().getStreet().getCity().getId();

        if (! (bornCityId == 0)) {
            City city = cityDao.findById(bornCityId);
            moderator.getBornInfo().setCity(city);
        }

        if (! (contactCityId == 0)) {
            City city = cityDao.findById(contactCityId);
            moderator.getContactInfo().getAddress().getStreet().setCity(city);
        }

        return moderatorDao.save(moderator).toString();

    }

【问题讨论】:

    标签: spring entity-framework hibernate rest jpa


    【解决方案1】:

    我使用ModeratorService来解决这个问题:

    @Service
    public class ModeratorService  {
    
        @Autowired
        private SessionFactory sessionFactory;
    
        @Transactional
        public Moderator save(Moderator moderator) {
    
            Session session = sessionFactory.getCurrentSession();
            session.saveOrUpdate(moderator);
    
            return moderator;
        }
    
    }
    

    以及更改Controller的方法:

        @RequestMapping(value = "add", method = RequestMethod.POST)
        public String add(@RequestBody Moderator moderator) {
    
            return moderatorService.save(moderator).toString();
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 2020-07-03
      相关资源
      最近更新 更多