【发布时间】:2016-01-02 17:47:03
【问题描述】:
我在使用 Spring JPA 时遇到了一个问题。我用谷歌搜索并研究了半天,但没有结果。让我告诉你我的代码。我编写了一个实体,它在数据库中引用另一个具有外键的域类,但实体的连接列不是主键“id”。两个实体如下:
@Entity
@Table(name = "tb_user")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
... getters and setters ...
}
@Entity
@Table(name = "tb_timebank")
public class TimebankEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JoinColumn(name = "username")
private UserEntity user;
... getters and setters ...
}
我使用 spring JPA CrudRepository 来做自定义查询:
@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long> {
public UserEntity findByUsername(String username);
}
@Repository
public interface TimebankRepository extends CrudRepository<TimebankEntity, Long> {
public TimebankEntity findByUser(UserEntity user);
}
这很简单。但是,当我在服务中执行业务逻辑时,出现了问题。
@Service
public class TimebankService {
@Autowired
TimebankRepository timebankRepository;
@Autowired
UserRepository userRepository;
public TimebankDto getTimebank(String username) {
UserEntity userEntity = userRepository.findByUsername(username);
TimebankEntity timebankEntity = timebankRepository
.findByUser(userEntity);
return new TimebankDto(timebankEntity.getUser().getUsername(),
timebankEntity.getLeaveType().getCode(),
timebankEntity.getTotalHours(),
timebankEntity.getAvailableHours());
}
}
我使用用户名“Tom”运行上面的代码,我可以获得数据库中存在的正确 userEntity。但是 findByUser(userEntity) 返回 null 结果。 hibernate生成的sql和message输出如下:
Hibernate: select userentity0_.id as id1_2_, userentity0_.introduction as introduc2_2_, userentity0_.password as password3_2_, userentity0_.username as username4_2_ from tb_user userentity0_ where userentity0_.username=?
Hibernate: select timebanken0_.id as id1_1_, timebanken0_.available_hours as availabl2_1_, timebanken0_.leave_type as leave_ty4_1_, timebanken0_.total_hours as total_ho3_1_, timebanken0_.username as username5_1_ from tb_timebank timebanken0_ left outer join tb_user userentity1_ on timebanken0_.username=userentity1_.id where userentity1_.id=?
o.h.engine.jdbc.spi.SqlExceptionHelper:SQL Warning Code: 1292, SQLState: 22007
o.h.engine.jdbc.spi.SqlExceptionHelper:Truncated incorrect DOUBLE value: 'Tom'
似乎“Tom”被分配给“id”字段,所以它返回一个空结果,但为什么会发生这种情况?我的代码有什么问题?我检查了 spring jpa 参考,但没有找到答案。请给我一些建议,并提前感谢!
【问题讨论】:
-
只是好奇:你为什么用非 Id 字段@JoinColumn?按id加入不是更有用吗?
-
数据库中的索引键是外键
tb_timebank(username) references tb_user(username),主键tb_user和tb_timebank都是id,两个id没有外键约束。 -
@FlorianSchaetz 感谢您的快速回复。有2个原因。首先,我在数据库中设置了一个外键。其次,我可以直接从 tb_timebank 获取用户名。正如你所说,我将@JoinColumn 注释替换为
@JoinColumn(insertable=false,updatable=false,referencedColumnName = "id"),然后我收到另一条消息:`'字段列表'中的未知列'timebanken0_.user_id'`。
标签: java spring hibernate spring-mvc jpa