Spring数据hibernate异常:实例的标识符被更改

时间:2018-03-20 11:59:06

标签: java spring hibernate

我有一个spring boot应用程序,它使用spring数据和hibernate来获取数据并将数据插入数据库。 我有一对多的表关系:

@Entity
@Data
@EqualsAndHashCode(of = { "id" })
@Table(name = "direction")
public class Direction {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

@Column(name = "name")
private String name;
}

@Entity
@Table(name = "subdivision")
@Data
@EqualsAndHashCode()
public class Subdivision {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

@Column(name = "name")
private String name;

@ManyToOne()
@JoinColumn(name = "direction_id", referencedColumnName = "id")
private Direction direction;
}

我有用于boilarplate代码生成的lombok插件。 我也有资源库

public interface SubdivisionRepository extends CrudRepository<Subdivision, Long> {

List<Subdivision> findAll();

List<Subdivision> findByDirection(Direction direction);

}

和服务

@Service
public class SubdivisionServiceImpl implements SubdivisionService {

@Autowired
private SubdivisionRepository subdivisionRepository;

@Override
public List<Subdivision> findAll() {
    return subdivisionRepository.findAll();
}

@Override
public Subdivision findById(Long id) {
    return subdivisionRepository.findById(id).get();
}

@Override
@Transactional
public void save(Subdivision subdivision) {
    subdivisionRepository.save(subdivision);
}

@Override
public List<Subdivision> findByDirection(Direction direction) {
    return subdivisionRepository.findByDirection(direction);
}
}

这就是全部。然后我尝试通过更改方向类型更新子方向,它显示hibernate异常:托管刷新期间出错[org.hibernate.HibernateException:com.entity.Direction实例的标识符从2更改为3]

我在stackoverflow上发现了同样的问题,但没有任何建议有帮助。 我试图更改获取类型和级联类型,但它没有帮助。

有没有人有解决方案?

P.S这里的代码我如何更新实体

public void updateSubdivision(Subdivision subdivision){
    Direction d = directionService.findById(subdivision.getDirection().getId());
    Subdivision s = new Subdivision();
    s.setDirection(d);
    s.setName(subdivision.getName());
    s.setId(subdivision.getId());
    subdivisionService.save(s);
}

它的控制器方法

0 个答案:

没有答案