百里香嵌套集<Object>

Thymeleaf nested Set<Object>

我在访问一组嵌套对象时遇到问题。 我定义了以下对象:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "site")
public class Site {
    @Id
    @GeneratedValue(strategy = GerationType.IDENTITY)
    @Column(name="id", updatable=false,nullable=false)
    private Long id;

    private String siteName;
    private String siteLocation;

    @OneToMany(cascade=CascadeType.ALL, mappedBy = "site")
    private Set<Rack> rack = new HashSet<>();
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "rack")
public class Rack { 

    @Id
    @GeneratedValue(strategy = GerationType.IDENTITY)
    @Column(name="id", updatable=false,nullable=false)
    private Long id;
    private String rackName;
    private String rackAssetTag;
    private String rackCMDBCode;

    @ManyToOne
    @JoinColumn(name = "site_id")
    private Site site;

    @OneToMany(cascade=CascadeType.ALL, mappedBy = "box")
    private Set<Box> box = new HashSet<>();
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "box")
public class Box {  
    @Id
    @GeneratedValue(strategy = GerationType.IDENTITY)
    @Column(name="id", updatable=false,nullable=false)
    private Long id;
    private boxAssetTag;
    private boxCMDBCode;

    ManyToOne
    @JoinColumn(name = "rack_id")
    private Rack rack;

}

所有关系映射工作都非常出色。 问题是当我想为此创建一个漂亮的嵌套 table(css 格式和条件 thymeleaf 验证被删除,因为它是不相关的):

<div>
    <table>
        <thead>
            <tr>
                <th>Rack name</th>
                <th>Rack asset tag</th>
                <th>Rack CMDB code</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="rack:${site.rack}">
                <td th:text="${rack.rackName}"></td>
                <td th:text="${rack.rackAssetTag}"></td>
                <td th:text="${rack.rackCMDBCode}"></td>
            </tr>
            <tr>
                <td>
                    <table>
                        <thead>
                            <tr>
                                <th>Box asset tag</th>
                                <th>Box CMDB code</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr th:each="box:${rack.box}">
                                <td th:text="${box.boxAssetTag}">
                                <td th:text="${box.boxCMDBCode}">
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
        </tbody>
    </table>
</div>

控制器将一个对象 'site' 添加到包含所有关系的模型中。 访问我收到的页面时出现错误: 在 null

上找不到 属性 或字段 'box'

我认为当我移动到第二个 table 时,thymeleaf 会丢失在外部 table 中创建的对象架的上下文。因此,当我尝试在内部 table 中调用 th:each 时,没有机架对象来执行 ${rack.box}。 问题是如何在不丢失上面对象的上下文的情况下访问 thymeleaf 中的 'deeper' 对象?

此致, 杰瑞克

好的,我已经设法找到了解决方案。 我会写下来的。也许有一天会有人需要它。

所以我的想法是循环遍历每个对象,但在 body 元素上而不是在行上。这让您拥有更广泛的对象上下文

<div>
<table>
    <thead>
        <th>Rack name</th>
        <th>Rack asset tag</th>
        <th>Rack CMDB code</th>
    </thead>
    <tbody th:each="rack:${site.rack}">
        <tr>
            <td th:text="${rack.rackName}"></td>
            <td th:text="${rack.rackAssetTag}"></td>
            <td th:text="${rack.rackCMDBCode}"></td>
        </tr>
        <tr>
            <td>
                <table>
                    <thead>
                        <tr>
                            <th>Box asset tag</th>
                            <th>Box CMDB code</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr th:each="box:${rack.box}">
                            <td th:text="${box.boxAssetTag}">
                            <td th:text="${box.boxCMDBCode}">
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
    </tbody>
</table>