2011-09-01 107 views
1

如何保存休眠实体并忽略(不正确)瞬态模式。忽略保存休眠实体的瞬态模式

例如:

@Entity 
@Table(name="`REQUEST`") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="`receiver`",discriminatorType=DiscriminatorType.STRING,length=20) 
public abstract class Request implements UUIDAble{ 
    @Id @GeneratedValue(strategy=GenerationType.AUTO) 
    private Integer id; 
    @Transient 
    @NotNull 
    @Pattern(regexp="^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$") 
    private String vaucher; 

@Enumerated(EnumType.STRING) 
@Column(name="name",nullable=false) 
private RequestName name; 

public RequestName getName() { 
    return name; 
} 
public void setName(RequestName name) { 
    this.name = name; 
} 

public String getVaucher() { 
    return vaucher; 
} 
public void setVaucher(String vaucher) { 
    this.vaucher = vaucher; 
} 
} 

,我想保存:

Request request = new Request(); 
request.setVaucher("123"); 
request.setName(RequestName.SYSTEM); 

弹簧产生错误:

javax.validation.ConstraintViolationException: validation failed for classes [ru.icb.cpaclick.domain.OperatorCheckRequest] during persist time for groups [javax.validation.groups.Default, ] 
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:132) 
    at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:71) 
    at org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:159) 
    at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65) 
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) 
    at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) 
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) 
    at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) 
    at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) 
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:705) 
    at org.hibernate.impl.SessionImpl.save(SessionImpl.java:693) 

回答

1

你应该使用Hibernate验证的群组功能,并分配与在瞬态字段上指定的验证约束不同的group

如果您希望启用这些约束条件,则需要特别提及该组。默认情况下,当hibernate尝试保存实体时,它将检查所有的验证作为默认组的一部分。