简体   繁体   English

将AngularJs对象映射/导航到Hibernate实体

[英]Mapping/Navigation AngularJs Object to Hibernate entity

I'm having an angularjs/Spring/Hibernate application and i'm using REST service for interaction between angularjs and server side. 我有一个angularjs / Spring / Hibernate应用程序,并且我正在使用REST服务在angularjs和服务器端之间进行交互。 I want to persist one user to DB so this is how looks my angularjs side. 我想将一个用户保留到数据库,所以这就是我的angularjs方面的样子。

createUser: function(user){
            var userToSend = {
                        "firstName" : user.firstName,
                        "lastName" : user.lastName,
                        "homeAddress.location" : user.homeAddress.location  ,
                        "email" : user.email,
                        "ssoId": user.ssoId
                };
                    var a= $http.post('http://localhost:8080/MyDirectory/createUser/', userToSend)
                            .then(
                                    function(response){
                                      $rootScope.refresh();
                                        return response.data;
                                    }, 
                                    function(errResponse){
                                         window.alert(errResponse);
                                        console.error('Error while creating user');
                                        return $q.reject(errResponse);
                                    }
                            );

                            return null;
            },

My server side is this : 我的服务器端是这样的:

@Transactional(propagation = Propagation.REQUIRED)
    public void saveUser(User user) {
        Long nextLong = RandomUtils.nextLong(0, 10000L);
        // user.setId(nextLong.intValue());
        User merge = em.merge(user);
        System.out.println(" merged "); 
        em.persist(merge); 

        System.out.println("");
    }

and this is my user and homeaddress entities: 这是我的用户和家庭住址实体:

@Entity
@Table(name = "DIR_USER")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id = 1;

    @Column(name = "SSO_ID", unique = true, nullable = false)
    private String ssoId;

    @NotEmpty

    private String firstName;

    @NotEmpty
    @Column(name = "LAST_NAME", nullable = false)
    private String lastName;

    @NotEmpty
    @Column(name = "EMAIL", nullable = false)
    private String email;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<UserInscription> userInscription = new HashSet<UserInscription>();

    @OneToOne
//  @JsonManagedReference
    private HomeAddress homeAddress;

    public Set<UserInscription> getUserInscription() {
        return userInscription;
    }

    public void setUserInscription(Set<UserInscription> userInscription) {
        this.userInscription = userInscription;
    }

    // @JsonIgnore
    public HomeAddress getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(HomeAddress homeAddress) {
        this.homeAddress = homeAddress;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getSsoId() {
        return ssoId;
    }

    public void setSsoId(String ssoId) {
        this.ssoId = ssoId;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @JsonIgnore
    public Set<UserInscription> getUserDocuments() {
        return userInscription;
    }

    public void setUserDocuments(Set<UserInscription> UserInscriptions) {
        this.userInscription = UserInscriptions;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", ssoId=" + ssoId + ", firstName=" + firstName + ", lastName=" + lastName
                + ", email=" + email + "]";
    }

}







@Entity
public class HomeAddress implements Serializable {

    private static final long serialVersionUID = 1L;

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

    private String email;
    @OneToOne
    private Country country;
    private String location;
    @JsonBackReference
    @OneToOne
    private User relatedUser;

    public User getRelatedUser() {
        return relatedUser;
    }

    public void setRelatedUser(User relatedUser) {
        this.relatedUser = relatedUser;
    }

    public Country getCountry() {
        return country;
    }

    public void setCountry(Country country) {
        this.country = country;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

Now if i don't have the homeaddress value.It works fine but with homeaddress which is a OneToOne .I'm getting this exception: 现在如果我没有homeaddress值。它可以正常工作,但homeaddress是OneToOne。我收到此异常:

23-Mar-2016 11:35:00.081 WARNING [http-nio-8080-exec-33] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMessageNotReadable Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Unrecognized field "homeAddress.location" (class com.directory.model.User), not marked as ignorable (7 known properties: "lastName", "homeAddress", "ssoId", "id", "firstName", "email", "userInscription"])
 at [Source: java.io.PushbackInputStream@93d96d; line: 1, column: 61] (through reference chain: com.directory.model.User["homeAddress.location"]); nested exception is com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "homeAddress.location" (class com.directory.model.User), not marked as ignorable (7 known properties: "lastName", "homeAddress", "ssoId", "id", "firstName", "email", "userInscription"])
 at [Source: java.io.PushbackInputStream@93d96d; line: 1, column: 61] (through reference chain: com.directory.model.User["homeAddress.location"])

Post it like this : 像这样发布:

 var userToSend = {
                        "firstName" : user.firstName,
                        "lastName" : user.lastName,
                        "homeAddress":{location : user.homeAddress.location},
                        "email" : user.email,
                        "ssoId": user.ssoId
                };

Even though you can use it in JS/Java with "." 即使您可以在JS / Java中使用“。”来使用它。 this isn't how JSON is built. 这不是JSON的构建方式。 Json are object and sub objects must be define like i posted. Json是对象,子对象必须像我发布的那样定义。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM