0

这是我的第一篇文章,所以我希望我做对了。我已经搜索了两天的等效问题,但没有找到任何东西。

这是我所做的:我们有一个实体,它包含(除其他外)以下字段:

@Entity
@Access(AccessType.FIELD)
@Table(name = "component")
public class Component {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
            .
            .    
    @OneToMany
    @JoinTable(name = "component_dokumentation",
        joinColumns = @JoinColumn( name = "component_id" ), 
        inverseJoinColumns = @JoinColumn(name = "dokumentation_id"))
    private Set<FileType> dokumentation;

    private Long keySisMf = 0L;
            .
            .
    // Getter and Setter and stuff
}

经过一年的使用我们发现,我们的实体变得太大了,我们必须使用 DTO 对象将数据传输到客户端,修改它们并将它们返回给服务器。为此,我们建模了一个可嵌入的实体组件属性。

所以现在它看起来像:

@Entity
@Access(AccessType.FIELD)
@Table(name = "component")
public class Component {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
            .
            .
    @Embedded
    private ComponentAttributes componentAttributes;
            .
            . 
}   

@Embeddable
@Access(AccessType.FIELD)
public class ComponentAttributes {

    private static final long serialVersionUID = 1L;

    @OneToMany
    @JoinTable(name = "component_dokumentation",
        joinColumns = @JoinColumn( name = "component_id" ), 
        inverseJoinColumns = @JoinColumn(name = "dokumentation_id"))
    private Set<FileType> dokumentation;

    private Long keySisMf = 0L;
            .
            .
    // Getter and Setter and stuff
}

我们没有更改数据库中的任何内容。我们在为 set 文档设置值时遇到了问题。字段 keySisMf 不是问题。问题只与文档有关(我必须补充一点,FileType 只是一个基本实体,由一个 id 和几个字符串组成,所以没什么特别的)。获取值并将其传输给客户端既快速又正确。告诉服务器更改 keySisMf 不是问题。告诉服务器添加或删除 FileType 实例根本不起作用。没有错误但没有变化。

我们记录了 JPA 生成的 SQL,并且没有为 component.getComponentAttributes().setDokumentation(fileSet) 生成 SQL。

我们使用带有 ORACLE 数据库的 Glassfish 4.1.1 服务器。将文档从 Component 移动到 ComponentAttributes 时我错过了什么吗????

感谢您的帮助和耐心。

克里斯

4

0 回答 0