【问题标题】:Spring Deserialize manytomany table with extra columnSpring用额外的列反序列化manytomany表
【发布时间】:2021-10-19 08:35:10
【问题描述】:

我有一个映射到自定义表的多对多关系以添加额外的列。我可以反序列化它,但反序列化它会显示连接表的元素,我会只显示连接元素。所以我目前得到的是以下内容:

{
    "id": 122,
    "materials": [
        {
            "id": {
                "materialId": 162,
                "homeworkId": 122
            },
            "position": 1
        },
        {
            "id": {
                "materialId": 163,
                "homeworkId": 122
            },
            "position": 1
        }
    ]
}

我宁愿得到这样的东西:

{
    "id": 122,
    "materials": [
        162, 163
    ]
}

我正在使用标准 Spring 映射器进行反序列化:

@GetMapping("/api/homework/get")
public Homework getHomework(@RequestParam Long id) {
    return homeworkService.findById(id).orElseThrow(HomeworkNotFoundException::new);
}

我有以下java类(省略了不必要的方法和函数)

材质

@Getter @Setter @NoArgsConstructor
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "typeName")
@JsonIdentityInfo(scope = Material.class, generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonSubTypes({
        @JsonSubTypes.Type(value = FileMaterial.class, name = "fileMaterial"),
        @JsonSubTypes.Type(value = LinkMaterial.class, name = "linkMaterial")
})

@Entity
@Table(name="material")
@Inheritance(strategy = InheritanceType.JOINED)
public class Material implements FileOwner {
    private static final String sequenceName = "material_id_sequence";

    @Id
    @Column(nullable = false)
    @SequenceGenerator(allocationSize=10,  sequenceName=sequenceName, name=sequenceName)
    @GeneratedValue(generator=sequenceName, strategy=GenerationType.SEQUENCE)
    protected Long id;

    @OneToMany(mappedBy = "material", cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonManagedReference
    List<HomeworkMaterial> homeworks = new ArrayList<>();

}

家庭作业

@Getter @Setter @NoArgsConstructor
@JsonIdentityInfo(scope = Homework.class, generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Entity
@Table(name = "homework")
public class Homework {
    private static final String sequenceName = "homework_id_sequence";

    @Id
    @Column(nullable = false)
    @SequenceGenerator(allocationSize=10,  sequenceName=sequenceName, name=sequenceName)
    @GeneratedValue(generator=sequenceName, strategy= GenerationType.SEQUENCE)
    protected Long id;

    @OneToMany(mappedBy = "homework", cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonManagedReference
    List<HomeworkMaterial> materials = new ArrayList<>();
}

家庭作业材料

@Getter @Setter @NoArgsConstructor
@Entity
@Table(name = "homework_material")
public class HomeworkMaterial {
    @EmbeddedId
    private HomeworkMaterialId id;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("materialId")
    @JsonBackReference
    private Material material;

    @ManyToOne(fetch = FetchType.LAZY)
    @MapsId("homeworkId")
    @JsonBackReference
    private Homework homework;

    @Column(nullable = false)
    private int position;

    public HomeworkMaterial(Material material, Homework homework, int position) {
        this.material = material;
        this.homework = homework;
        this.position = position;
        this.id = new HomeworkMaterialId(material.getId(), homework.getId());
    }
}

HomeworkMaterialId

@Embeddable
@NoArgsConstructor @AllArgsConstructor @Getter @Setter
public class HomeworkMaterialId implements Serializable {

    @Column(name = "material_id")
    private long materialId;

    @Column(name = "homework_id")
    private long homeworkId;
}

对于标准的@manytomany 映射,我可以使用@jsonignoreproperties 实现此行为,但我无法将其转移到自定义连接表。

提前致谢!

【问题讨论】:

    标签: java spring hibernate serialization jackson


    【解决方案1】:

    您似乎希望将一组数字返回给客户端。

    您可以创建一个返回 id 数组的 getter,并通过注释将其他关系变为不可序列化。

    您只需要其中一个 id 的事实可能表明数据库中的映射不理想。

    【讨论】:

    • 感谢您的帮助。我也想过用getter的解决方案,但是之后有没有办法对其进行序列化?我认为映射很好,它是多对多关系的标准连接表。我只需要其中一个 id,因为另一个 id 是元素本身。
    猜你喜欢
    • 2014-07-14
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2018-01-01
    • 2017-01-02
    • 2014-03-11
    相关资源
    最近更新 更多