使用session.get()MapJPA/Hibernate中的实体字段

tkclm6bt  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(48)

为什么我不能创建新的地址使用:

AddressEntity ad = new AddressEntity(); 
ad.setCityId(session.get(CityEntity.class, 343))

但它是这样运作的:

Query<CityEntity> query = session.createQuery("from CityEntity where id = 343", CityEntity.class);
 query.setFirstResult(0);
 query.setMaxResults(1);
 List<CityEntity> listCity = query.getResultList();
 ad.setCityId(listCity.get(0));

地址实体:

@Entity
@Table(name = "address")
@Getter
@Setter
@ToString
public class AddressEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "address_id")
    private Short addressId;
    ...
    ...
    @ManyToOne
    @JoinColumn(name = "city_id")
    private CityEntity cityId;

}

城市实体:

@Entity
@Table(name = "city")
@Getter
@Setter
@ToString
public class CityEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "city_id")
    private Short cityId;
    ...
    ...
    ...

}

我觉得我不知道什么有用的东西,但我不能理解它是什么
我尝试通过session.get()和query来获取和设置id

mwecs4sa

mwecs4sa1#

这里的问题是主键(@Id属性)被定义为Short,但Java默认将session.get(CityEntity.class, 343)中的343转换为Integer;所以JPA会搜索一个带有**id的CityEntity,而这个id并不存在。
给它一个Short就可以了;或者:

session.get(CityEntity.class, Short.valueOf(343))

或者:

session.get(CityEntity.class, (short) 343)

在后一种情况下,Java仍然会将短文本“装箱”到Short对象中。

相关问题