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.
}