Hibernate AutoGenerated值无法与Jackson映射器一起使用

时间:2017-09-09 05:49:26

标签: spring hibernate jpa spring-boot jackson

我刚开始使用Spring Boot CrudRepository,现在我的Enitity有一个具有自动生成值的Unique字段(不是P.K)FeedID。 当我手动创建一个新对象而不设置FeedID值时,它工作正常,FeedID自动生成。 但是,当我使用JackSon对象映射器将请求参数Json直接转换为pojo对象时,它显示FeedID字段的空/重复异常。

控制器

@RequestMapping(method=RequestMethod.POST,value="/feed/addNewFeed")
public Feed addNewFeed(@RequestParam("Feed") String jsonFeed) throws JsonParseException, JsonMappingException, IOException  {
    Feed feed = new ObjectMapper().readValue(jsonFeed, Feed.class);         
    return feedRepoImplementation.addNewFeedImpl(feed);     
}

ENTITY

@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, unique = true)
    private int FEED_ID;
    @Id
    @Column(length=100)
    private String URL_LINK;//Primary Key
    private String HEADLINE;
    @Column(length=1500,nullable=false)
    private String CONTENT;
    @Column(length=500,nullable=false)
    private String HEADLINE_IMAGE;  
    private FeedCatagory CATAGORY;
    private String AUTHOUR_NAME;
    private String PUBLISHING_DATE; 
    private String PUBLISHED;
    private int VIEWS;
    private int SHARED;

错误

  com.microsoft.sqlserver.jdbc.SQLServerException: Violation of UNIQUE KEY constraint 'UK_6hu52poark0i0f4us9cfql8au'. Cannot insert duplicate key in object 'dbo.feed'.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) ~[sqljdbc4.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) ~[sqljdbc4.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) ~[sqljdbc4.jar:na]
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) ~[sqljdbc4.jar:na]
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) ~[sqljdbc4.jar:na]

但是如果我在不触及FeedID字段的情况下手动创建pojo而不是使用Objectmapper,它可以正常工作

    Feed feed = new Feed();
    feed.setAUTHOUR_NAME("AUTHOUR");
    feed.setCATAGORY(UtilityHelper.FeedCatagory.SPORTS);
    feed.setPUBLISHING_DATE("12/10/16");
    feed.setCONTENT("CONTENT");
    feed.setURL_LINK("URL-LINK");
    feed.setHEADLINE("HEADLINE");
    feed.setPUBLISHED("TRUE");
    feed.setSHARED(0);
    feed.setVIEWS(0);
    feedRepository.save(feed);

我猜在Client JSON中我没有包含自动生成的字段'FeedID',因此obectMapper会自动为该字段分配0,但是0已经存在,因此显示重复的约束。请帮忙

1 个答案:

答案 0 :(得分:1)

使用@RequestBody注释而不是@RequestParam并从前端或邮递员发送JSON,因此无需使用ObjectMapper将字符串转换为对象。

@RequestMapping(value="/feed/addNewFeed",method=RequestMethod.POST)
public Feed addNewFeed(@RequestBody Feed feed){     
    return feedRepoImplementation.addNewFeedImpl(feed);     
}

此外,您在@GeneratedValue字段中使用了FEED_ID@GeneratedValue如果与@Id一起使用,则会创建唯一编号。

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, unique = true)
    private int FEED_ID;

由于您已经有@Id注释字段,因此最好手动为FEED_ID生成唯一编号。为此,您必须在实体类中使用@PrePersist注释,如下所示:

@PrePersist
public void initializeFeedId() {
    Random random = new Random(System.currentTimeMillis());
    this.FEED_ID = random.nextInt(1000000000);
}

这将根据当前时间生成唯一编号。

相关问题