2017-10-15 41 views
1

我试着用休眠,JPA和JSON来休眠。 我不得不实体象下面这样:JPA和Hibernate dosnt更新一到多关系在第一次尝试中使用JSON的春天休息

University.java

@Entity() 
@Table(name = "university") 
public class University extends BaseEntity { 
    private String uniName; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinColumn(name = "university_id", foreignKey = @ForeignKey(name = "university_id")) 
    private Collection<Student> students; 

    //setters and getters 
} 

Student.java

@Entity 
@Table(name = "student") 
public class Student extends BaseEntity { 
    private String stuName; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JsonIgnoreProperties("students") 
    private University university; 

    //setters and getters 
} 

我在我的分贝这dumy值。

[ 
    { 
    "id": 1, 
    "uniName": "uni1", 
    "students": [ 
     { 
     "id": 1, 
     "stutName": "st1", 
     "university": { 
      "id": 1, 
      "uniName": "uni1" 
     } 
     }, 
     { 
     "id": 2, 
     "stutName": "st2", 
     "university": { 
      "id": 1, 
      "uniName": "uni1" 
     } 
     } 
    ] 
    } 
] 

第一次尝试:当我尝试更新它的学生的大学,没有成功 ,这是我的休眠日志

Hibernate: 
    select 
     university0_.id as id1_5_1_, 
     university0_.uniName as uniName2_5_1_, 
     students1_.university_id as universi3_4_3_, 
     students1_.id as id1_4_3_, 
     students1_.id as id1_4_0_, 
     students1_.stuName as stuName2_4_0_, 
     students1_.university_id as universi3_4_0_ 
    from 
     university university0_ 
    left outer join 
     student students1_ 
      on university0_.id=students1_.university_id 
    where 
     university0_.id=? 
Hibernate: 
    update 
     student 
    set 
     stuName=?, 
     university_id=? 
    where 
     id=? 
Hibernate: 
    update 
     university 
    set 
     uniName=? 
    where 
     id=? 
Hibernate: 
    update 
     student 
    set 
     stuName=?, 
     university_id=? 
    where 
     id=? 

第二次尝试:但是,当我发表相同的数据第二次它是成功和休眠日志是

Hibernate: 
    select 
     university0_.id as id1_5_1_, 
     university0_.uniName as uniName2_5_1_, 
     students1_.university_id as universi3_4_3_, 
     students1_.id as id1_4_3_, 
     students1_.id as id1_4_0_, 
     students1_.stuName as stuName2_4_0_, 
     students1_.university_id as universi3_4_0_ 
    from 
     university university0_ 
    left outer join 
     student students1_ 
      on university0_.id=students1_.university_id 
    where 
     university0_.id=? 
Hibernate: 
    select 
     student0_.id as id1_4_0_, 
     student0_.stuName as stuName2_4_0_, 
     student0_.university_id as universi3_4_0_ 
    from 
     student student0_ 
    where 
     student0_.id=? 
Hibernate: 
    select 
     student0_.id as id1_4_0_, 
     student0_.stuName as stuName2_4_0_, 
     student0_.university_id as universi3_4_0_ 
    from 
     student student0_ 
    where 
     student0_.id=? 
Hibernate: 
    update 
     student 
    set 
     university_id=? 
    where 
     id=? 
Hibernate: 
    update 
     student 
    set 
     university_id=? 
    where 
     id=? 

与第一个不同!

我在做什么我的hibernate注释错误,或者如果我在我的JSON注释中缺少某些东西,为什么第二次尝试工作。

更新:这是我的编辑服务

@Override 
@Transactional/*(propagation = Propagation.NESTED)*/ 
public T edit(T entity) throws Exception { 
    return entityManager.merge(entity); 
} 

任何帮助和建议表示赞赏。

+1

发布持久数据的代码。 –

+0

@ Abdullah Khan我更新了我的问题 – Generic

+1

你的映射是错误的。阅读Hibernate手册,了解如何正确映射双向OneToMany关联。 –

回答

1

University.java

@Entity() 
@Table(name = "university") 
public class University extends BaseEntity { 
    private String uniName; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinColumn(name = "university_id") 
    private Collection<Student> students; 

    //setters and getters 
} 

Student.java

@Entity 
    @Table(name = "student") 
    public class Student extends BaseEntity { 
     private String stuName; 

     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "university_id",updatable = false,insertable = false) 
     @JsonIgnoreProperties(value = "students", allowSetters = true) 
     private University university; 

     //setters and getters 
    } 

我希望这种帮助别人有同样的问题。

1

试着改变我的实体,如低于它的工作完美后更新您的实体,像这样

@Entity 
@Table(name = "university") 
public class University extends BaseEntity { 

    private String uniName; 

    @OneToMany(mappedBy = "university", ...) // Check the mappedBy property 
    private Collection<Student> students; 

    //setters and getters 

} 

@Entity 
@Table(name = "student") 
public class Student extends BaseEntity { 

    private String stuName; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JsonIgnoreProperties("students") 
    private University university; // university is bidirectionally mapped to Student 

    //setters and getters 
} 
+0

我需要双方急切和JSON序列化它有循环,如果我添加@JsonIdentity信息JSON序列化是不符合我的要求 – Generic

+0

对于这个问题使用不同的DTO类将您的JSON映射到方法参数。 –

+0

请更具体如何将它 – Generic