【发布时间】:2015-01-24 21:32:25
【问题描述】:
我有一个具有复合键的实体,我正在尝试通过使用 spring data jpa 存储库到 mysql 数据库来将其持久化,如下所示:
@Embeddable
public class MobileVerificationKey implements Serializable{
private static final long serialVersionUID = 1L;
@Column(name="CUSTOMERID")
private Long customerId;
@Column(name="CUSTOMERTYPE")
private Integer customerType;
@Column(name="MOBILE")
private Long mobile;
@Embeddable
public class MobileVerificationKey implements Serializable{
private static final long serialVersionUID = 1L;
@Column(name="CUSTOMERID")
private Long customerId;
@Column(name="CUSTOMERTYPE")
private Integer customerType;
@Column(name="MOBILE")
private Long mobile;
//getter and setters
}
实体为
@Entity
@Table(name="mobileverificationdetails")
public class MobileVerificationDetails {
@EmbeddedId
private MobileVerificationKey key;
@Column(name="MOBILETYPE")
private String mobileType;
@Column(name="MOBILEPIN")
private Integer mobilePin;
//getters and setters
}
我的 spring 数据 jpa 存储库如下所示:
public interface MobileVerificationDetailsRepository extends
CrudRepository<MobileVerificationDetails, MobileVerificationKey> {
@Override
MobileVerificationDetails save(MobileVerificationDetails mobileVerificationDetails);
@Override
MobileVerificationDetails findOne(MobileVerificationKey id);
}
现在,如果我尝试为原始记录添加具有相同键的重复记录,而为其他字段添加不同值。当我尝试插入第二条记录时,它会导致使用新值更新现有记录,而不是因违反主键而引发异常约束...任何人都可以向我解释这种行为。
【问题讨论】:
-
您的更新代码 (DAO) 是什么?您这里只有型号代码。
-
Spring data jpa 存储库会合并您的实体(如果它已经存在)。裸 EntityManager#persist() 将产生您要求的行为。
-
@Michal 有没有使用 spring data jpa 的解决方案?
-
你可以用自定义的persist()方法扩展你的spring数据jpa存储库/存储库,并通过EntityManager#persist()实现它,EntityManager可以注入到自定义方法的实现类中。这将是官方支持的方式。
-
您也可以尝试直接覆盖 SimpleJpaRepository 上的 save() 方法。然后,您需要更改 spring 内部接线,以便使用您的扩展代替 SimpleJpaRepository。请注意,修改 SimpleJpaRepository 不是官方/支持的做事方式,并且可能(或可能不会)产生一些副作用。
标签: java spring jpa spring-data spring-data-jpa