Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate只更新选定的列,而不是所有修改的字段_Java_Hibernate_Ejb - Fatal编程技术网

Java Hibernate只更新选定的列,而不是所有修改的字段

Java Hibernate只更新选定的列,而不是所有修改的字段,java,hibernate,ejb,Java,Hibernate,Ejb,我有一个实体: @Entity @Table( name = "my_dto" ) public class MyDto implements Serializable { @Id @GeneratedValue( generator = "uuid" ) @GenericGenerator( name = "uuid", strategy = "uuid" ) private String id; private String displayName;

我有一个实体:

@Entity
@Table( name = "my_dto" )
public class MyDto implements Serializable
{
    @Id
    @GeneratedValue( generator = "uuid" )
    @GenericGenerator( name = "uuid", strategy = "uuid" )
    private String id;
    private String displayName;
    private String remark;
    @Column( name = "BACKGROUND" )
    private Integer backgroundColorInt;
    @Column( name = "FOREGROUND" )
    private Integer foregroundColorInt;

    private boolean isBold;
    private boolean isItalic;
    private boolean isUnderlined;
    @Column( name = "ISBLINKINGACTIVE" )
    private Boolean blinkingActive;
    @Column( name = "ISBLINKINGBOLD" )
    private Boolean blinkingBold;
    @Column( name = "ISBLINKINGITALIC" )
    private Boolean blinkingItalic;
    @Column( name = "ISBLINKINGUNDERLINED" )
    private Boolean blinkingUnderlined;
    @Column( name = "BLINKINGBACKGROUND" )
    private Integer blinkingBackColorInt;
    @Column( name = "BLINKINGFOREGROUND" )
    private Integer blinkingForeColorInt;

    @Column
    private String createdBy;
    @Column
    private Date createDat;
    @Column
    private String changedBy;
    @Column
    private Date changeDat;
    @Version
    private int version;

    @Transient
    private Map< String, Object > appearanceConfig = null;

    @PostLoad
    public void copyMyDto2AppearanceConfig()
    {
        if( appearanceConfig == null )
        {
            appearanceConfig = new HashMap< String, Object >();
        }
        appearanceConfig.put( BACKGROUND_COLOR, backgroundColorInt );
        appearanceConfig.put( FOREGROUND_COLOR, foregroundColorInt );
        appearanceConfig.put( FONT_STYLE, getFontStyle() );

        appearanceConfig.put( IS_BLINKING_ACTIVE, blinkingActive );
        HashMap< String, Object > blinkingConf = new HashMap< String, Object >();
        blinkingConf.put( FOREGROUND_COLOR, blinkingForeColorInt );
        blinkingConf.put( BACKGROUND_COLOR, blinkingBackColorInt );
        blinkingConf.put( FONT_STYLE, getBlinkingFontStyle() );
        appearanceConfig.put( BLINKING_CONFIGURATION, blinkingConf );
    }

    @PreUpdate
    public void copyAppearanceConfig2MyDto()
    {
        setForegroundColor( (Integer)appearanceConfig.get( FOREGROUND_COLOR ) );
        setBackgroundColor( (Integer)appearanceConfig.get( BACKGROUND_COLOR ) );
        setFontStyle( (FontStyle[])appearanceConfig.get( FONT_STYLE ) );
        setBlinkingActive( Boolean.TRUE.equals( appearanceConfig.get( IS_BLINKING_ACTIVE ) ) );
        Map< String, Object > blinkingConf =
        (Map< String, Object >)appearanceConfig.get( BLINKING_CONFIGURATION );
        if( blinkingConf != null )
        {
            setBlinkingFontStyle( (FontStyle[])blinkingConf.get( FONT_STYLE ) );
            setBlinkingForegroundColor( (Integer)blinkingConf.get( FOREGROUND_COLOR ) );
            setBlinkingBackgroundColor( (Integer)blinkingConf.get( BACKGROUND_COLOR ) );
        }
        else
        {
            setBlinkingFontStyle( null );
            setBlinkingForegroundColor( (Integer)null );
            setBlinkingBackgroundColor( (Integer)null );
        }
    }

    // some standard getters and setters...
}

当我尝试更新所选行时,结果显示数据库中只更新了
displayName
remark
字段,即使
aMyDto
的一些其他字段也已修改。原因是否可能在于
MyDto
类中的@PreUpdate和@PostLoad方法?由于我的想法越来越少,我想请你指出这种奇怪行为的可能原因。我最可能错过的是什么?问题出在哪里?

在更新之前,详细信息会从
appearanceConfig
哈希映射复制到字段中

如果
appearanceConfig
哈希映射没有最新的更改,则该哈希映射中的旧值将覆盖更改


请注意,为什么不删除所有成员字段,直接写入哈希映射?您可以使用getter和setter,它们直接将数据设置到哈希映射。

在更新之前,详细信息将从
appearanceConfig
哈希映射复制到字段

如果
appearanceConfig
哈希映射没有最新的更改,则该哈希映射中的旧值将覆盖更改

请注意,为什么不删除所有成员字段,直接写入哈希映射?您可以使用getter和setter,它们直接将数据设置到哈希映射

@Stateless
@Remote( MyDtoStorageServiceIf.class )
public class MyDtoStorageService implements MyDtoStorageServiceIf
{
    @PersistenceContext( unitName = "DS_MY_DTO", name = "DS_MY_DTO" )
    protected EntityManager entityManager;
    @Override
    public MyDto update( MyDto aMyDto )
    {
        MyDto myDto = entityManager.merge( aMyDto );
        entityManager.flush();
        return myDto;
    }
    // other EJB methods, e.g. persisting new MyDto object, deleting selected MyDto from database etc.
}